백엔드 Back-end/테스트 Test

Q. 유명 개발자들은 파이썬 테스트 코드를 어떻게 작성할까?

Tap to restart 2022. 7. 25. 21:00
반응형

A. 사례를 찾아보면 진짜 생각보다 간단하게 짠다. 

 

테스트 코드 작성 어렵다. 작성하면서도 이게 과연 올바른가 의심될 때가 있다. 이럴 때는 유명 개발자들은 어떻게 하는지 찾아보는 것만으로도 큰 도움이 된다. 게다가 개발 바닥은 쉽게 찾을 수 있으니! 

 

구글

구글부터 살펴보자. 

github에서 구글로 들어가서, 언어는 파이썬, 정렬은 별개수로 하자.  

목록 상단에 있는 google / jax를 골랐다. 여기 들어가니 tests 디렉터리가 있다!

 

여러 테스트 파일 중 core_test.py를 보자.

tree_flatten이란 함수를 테스트하는 코드는 아래가 다다. 

값은 직접 입력했고, 입력한 값은 아주 간단한 것을 볼 수 있다. 10개가 아니라 1개다.

  def test_tree_flatten(self):
    flat, _ = tree_flatten(({'a': 1}, [2, 3], 4))
    assert flat == [1, 2, 3, 4]

 

마이크로소프트

이번에는 마이크로소프트를 살펴보자. 

github에서 마이크로소프트를 들어가서, 언어는 파이썬, 정렬은 별개수로 하자. 

 

여기서 microsoft / recommenders란 저장소를 골랐다. 

가장 이해하기 쉬운 테스트를 찾다가 test_generals_utils.py 을 열어봤다.

def test_invert_dictionary():
    d = {"a": 1, "b": 2}
    d_inv = invert_dictionary(d)
    assert d_inv == {1: "a", 2: "b"}


def test_get_number_processors():
    assert get_number_processors() >= 1

 

역시나 invert_dictionary란 함수를 테스트하기 위해서 여러개 데이터를 입력하지 않고 달랑 1개만 입력해서 테스트했다. 

그것도 무작위로 만들기보다 진짜 이해하기 쉬운 숫자로!

 

아마존

이번에는 아마존을 찾아봤다. aws / aws-cli란 저장소를 골랐다. 

쉽게 이해할 수 있는 unit 테스트에서 파일을 열어 봤다. 

 

    def test_binary_file(self):
        contents = 'This is a test'
        filename = self.files.create_file('foo', contents)
        prefixed_filename = 'fileb://' + filename
        data = self.get_paramfile(prefixed_filename)
        self.assertEqual(data, b'This is a test')
        self.assertIsInstance(data, six.binary_type)

 

역시나 랜덤을 쓰기 보다는 아주 간단한 문장을 넣어서 테스트했다. "This is test".

 

에러 경우에는 메소드명에 에러 테스트인지 알 수 있게 해놓았다. 

	def test_file_does_not_exist_raises_error(self):
        with self.assertRaises(ResourceLoadingError):
            self.get_paramfile('file://file/does/not/existsasdf.txt')

 

전 세계 유명한 IT 기업들의 깃허브 저장소에 들어가서 테스트 코드를 살펴봐도 별 게 없단 것을 알 수 있다. 

특별히 한 함수에 대한 유닛 테스트를 10개씩 짜지도 않았고, 특별히 무작위 입력 방식을 쓰지도 않았다. 

그저 눈으로 쉽게 확인할 수 있게 아주 간단한 입력값을 넣은 것을 확인할 수 있었다. 

 

테스트 코드 자체를 복잡하게 쓴 경우는 거의 보지 못했고, 코드의 반복을 줄이기 위해서 parameterised를 쓴 정도였다. 

  @parameterized.parameters([
      (1, 2, 3),
      (
          np.asarray(1, np.int32),
          np.asarray(2, np.int32),
          np.asarray(3, np.int32),
      ),
  ])

 

가짜 데이터 생성 팩키지인 faker를 쓴 경우는 찾아볼 수 없었다. 

 

함수 하나를 제대로 테스트 하기 위해서는 그래 한 10개 테스트는 짜야 하는 거 아닌가? 이렇게 생각했는데, 실제 그렇게 짠 경우는 거의 볼 수 없었다. 단순한 거 하나만 테스트해도 일단 의도대로 작동하는지 알 수 있으니까 그런 거 같다. 

 

그냥 아주 간단하게 1개부터 짜자. 그것도 눈으로만 봐도 바로 함수가 오류가 있는지 아닌지 파악하기 아주 쉬운 데이터를 입력해서! 다들 그렇게 하고 있다. 이 지구상의 최고의 개발자들이 모인 바로 그 회사들에서도!

반응형