TestCase 클래스에서는 테스트 메서드를 실행하기 전에 테스트 환경을 구축해야 하는 경우가 자주 있습니다.
- 이런 테스트 과정을 테스트 하네스(test harness)라고 부르기도 합니다.
setUp, tearDown 두 메서드를 활용하면 각 테스트를 서로 격리된 상태에서 실행할 수 있습니다.
- 테스트 간의 격리는 테스트를 제대로 진행하기 위해 가장 중요한 실무 지침 입니다
- setUp은 테스트 메서드를 실행하기 전에 호출됨
- tearDown 메서드는 테스트 메서드를 실행한 다음에 호출됨
- (예) 테스트를 진행하기 전에 임시 디렉터리를 만들고 테스트가 끝난 후 디렉터리 내용을 지우는 TestCase 클래스를 정의한 코드다.
# environment_test.py
from pathlib import Path
from tempfile import TemporaryDrirectory
from unittest import TestCase, main
class EnvironmentTest(TestCase):
def setUp(self):
self.test_dir = TemporaryDrirectory()
self.test_path = Path(self.test_dir.name)
def tearDown(self):
self.test_dir.cleanup()
def test_modify_file(self):
with open(self.test_path / 'data.bin', 'w') as f:
...
if __name__ == '__main__':
main()
프로그램이 복잡해지면 코드를 독립적으로 실행하는 대신에 여러 모듈 사이의 단대단(end-to-end) 상호작용을 검증하는 테스트가 필요할 수도 있습니다.
흔히 발생하는 문제로 통합 테스트에 필요한 테스트 호나경을 구축할 때 계산 비용이 너무 비싸거나, 너무 오랜 시간이 소요될 경우가 있습니다.
- (예) 통합 테스트를 진행하기 위해 데이터베이스 프로세스를 시작하고 데이터베이스가 모든 인덱스를 메모리에 읽어올 때까지 기다려야 할 수도 있다.
이런 상황을 해결하기 위해 unittest 모듈은 모듈 단위의 테스트 하네스 초기화를 지원합니다.
다음 코드는 TestCase 클래스가 들어 있는 모듈 안에 setUpModule과 tearDownModule 메서드를 정의해 위 동작을 지원합니다.
# integration_test.py
from unittest import TestCase, main
def setUpModule():
print('* 모듈 설정')
def tearDownModule():
print('* 모듈 정리')
class IntegrationTest(TestCase):
def setUp(self):
print('* 테스트 설정')
def tearDown(self):
print('* 테스트 정리')
def test_end_to_end1(self):
print('* 테스트 1')
def test_end_to_end2(self):
print('* 테스트 2')
if __name__ == '__main__':
main()
.
----------------------------------------------------------------------
Ran 1 test in 0.008s
OK
unittest에 의해 setUpModule이 단 한번만 실행됐음을 확실히 알 수 있습니다.
- 다른 모든 setUp 메서드가 호출되기 전에 setUpModule이 호출됐음을 알 수 있다.
- 마찬가지로 tearDownModule은 모든 tearDown 메서드가 호출된 뒤에 호출된다.
### 기억해야할 내용 ###
- 단위 테스트(함수, 클래스 등의 기본 단위를 격리시켜 검증하는 테스트)와 통합 테스트(모듈 간의 상호작용을 검증하는 테스트)를 모두 작성하는 것이 중요하다.
- setUp과 tearDown 메서드를 사용하면 테스트 사이를 격리할 수 있으므로 더 깨끗한 테스트 환경을 제공할 수 있다.
- 통합 테스트의 경우 모듈 수준의 함수인 setUpModule과 tearDownModule을 사용하면 테스트 모듈과 모듈 안에 포함된 모든 TestCase 클래스의 전체 생명 주기 동안 필요한 테스트 하네스를 관리할 수 있다.
'파이썬 코딩의 기술' 카테고리의 다른 글
파이썬코딩의기술 - BW 86 : 배포 환경을 설정하기 위해 모듈 영역의 코드를 사용하라 (0) | 2023.04.13 |
---|---|
파이썬코딩의기술 - BW78 : 목을 사용해 의존 관계가 복잡한 코드를 테스트 하라 (0) | 2023.04.12 |
파이썬코딩의기술 - BW55 : Queue를 사용해 스레드 사이의 작업을 조율하라 (0) | 2023.03.28 |
파이썬코딩의기술 - BW54 : 스레드에서 데이터 경합을 피하기 위해 Lock을 사용하라 (0) | 2023.03.27 |
파이썬코딩의기술 - Betterway 48 : __init_subclass__를 사용해 하위 클래스를 검증하라 (0) | 2023.03.24 |