본문 바로가기

파이썬 코딩의 기술

파이썬코딩의기술 - BW77 : setUp, tearDown, setUpModule, tearDownModule을 사용해 각각의 테스트를 격리하라

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 클래스의 전체 생명 주기 동안 필요한 테스트 하네스를 관리할 수 있다.