이 문서는 파이썬 테스트 방법과 가이드라인을 제공한다. 이는 파이썬 테스트 추천 라이브러리와 활용 방법에 대한 내용을 포함한다. 해당 문서 내용은 추천 사항이며, 각 프로젝트에 따라 다른 방법을 적용하거나 제안할 수 있다. 다만 이 경우에도 프로젝트 내에서는 통일성을 갖는 것을 장려한다.
유닛 테스트
이 문서에서는 python 이 제공하는 기본 라이브러리인 unittest를 사용해서 유닛 테스트를 구성한다. 더 효율적으로 테스트를 구성하기 위해 pytest를 활용할 수 있다. 유닛 테스트 기본 가이드라인은 테스트 기본 원칙 문서를 참고한다.
테스트 레이아웃
프로젝트 최상위 폴더에 tests
폴더를 추가한 뒤 해당 폴더에 테스트 파일을 추가한다. 이 레이아웃을 통해 애플리케이션 코드와 테스트 코드를 분리할 수 있다. 한편 테스트 코드를 애플리케이션 코드의 일부로 배치하는 레이아웃도 가능하다. 프로젝트에 따라 각자 테스트 레이아웃을 선택하되 Choosing a test layout / import rules 문서를 참고하여 판단한다.
테스트 구성
unittest.TestCase
를 사용하여 테스트 클래스를 구성한다. 해당 클래스의 단정 메소드(assert methods)를 활용해서 검증하고자 하는 상태를 확인한다.
import unittest
from unittest.mock import Mock
from actual.package import some_method
class TestClass(unittest.TestCase):
def test_some_method(self):
target = some_method()
self.assertIsNotNone(target)
self.assertEqual(target.value, 42)
테스트 전/후처리
unittest.TestCase
의 setUp
를 통해서 테스트에 필요한 전 처리를 수행할 수 있다. 테스트 대상 객체 초기화나 테스트마다 재사용되는 디펜던시 객체 초기화 등이 이에 포함된다.
import unittest
from unittest.mock import Mock
from actual.package.repo import Repo
class TestRepo(unittest.TestCase):
def setUp(self):
self.target = Target()
def test_target_method(self):
return_value = self.target.do_something()
self.assertTrue(return_value)
또한 unittest.TestCase
의 tearDown
메소드를 통해 테스트 도중 발생한 변경 사항을 초기화 할 수 있다. 예를 들어 불가피하게 데이터베이스 사용이 필요한 테스트의 경우 tearDown
메소드에서 생성된 데이터를 초기화할 수 있다.
디펜던시 모킹
테스트 대상이 가지고 있는 디펜던시는 모킹하여 사용한다. 디펜던시 객체의 구현에 따라 테스트 결과가 달라지지 않게 주의한다.
repo.py
class Repo:
def __init__(self, cache_data_source: DataSource, remote_data_source: DataSource):
self.cache_data_source = cache_data_source
self.remote_data_source = remote_data_source
# ...
test_repo.py
import unittest
from unittest.mock import Mock
from actual.package.repo import Repo
class TestRepo(unittest.TestCase):
def test_some_method(self):
cache_data_source = Mock()
remote_data_source = Mock()
repo = Repo(cache_data_source, remote_data_source)
# ...
테스트 픽스쳐(Fixture)
테스트에 필요한 리소스를 미리 구성하여 사용할 수 있다.
TBD