파이썬 단위테스트(unittest) 사용하기 -1
unittest
-
단위 테스트 프레임워크로 본래 JUnit 으로부터 영감을 받고 다른 언어의 주요 단위 테스트 프레임워크와 비슷한 특징을 가지고 있다.
-
테스트 자동화, 테스트를 위한 사전 설정(setup)과 종료(shutdown) 코드 공유, 테스트를 컬렉션에 종합하기, 테스트와 리포트 프레임워크의 분리 등을 지원한다.
개념
-
test fixture : 1개 또는 그 이상의 테스트를 수행할 때 필요한 준비와 그와 관련된 정리 동작에 해당된다.
-
test case : 테스트의 개별 단위이다.
-
test suite: 여러 테스트 케이스, 테스트 슈트의 모음으로 서로 같이 실행되어야할 테스트들을 종합하는데 사용
-
test runner: 테스트 실행을 조율하고 결과를 사용자에게 제공하는 역할을 하는 컴포넌트이다.
정리
-
test_ : 테스트 메서드 인식
-
test_run() : 실행여부 판별
-
setUp() : 테스트 전에 수행
-
tearDown() : 테스트 후에 수행
-
unittest.main() : 테스트 수행
예제 1
getter, setter 메서드가 정의되어있는 추상 클래스입니다.
base_shark.py
from abc import *
class Shark(ABC):
@property
def name(self):
pass
@name.setter
@abstractmethod
def name(self, name):
pass
위의 추상 클래스를 상속받는 클래스입니다.
shark.py
from base_shark import BaseShark
class Shark(BaseShark):
def __init__(self):
self.__name = None
# @property
# def name(self):
# return self.__name
# @name.setter
# def name(self, name):
# self.__name = name
테스트 케이스 작성할 때는 TestCase 를 상속받는 클래스를 작성하고, 테스트를 수행할 메서드를 추가하면 됩니다.
test.py
import unittest
from shark import Shark
class TestShark(unittest.TestCase):
def setUp(self):
self.shark = Shark()
def test_get_name(self):
print(self.shark.name)
if __name__ == '__main__':
unittest.main()
인스턴스 속성 __name 을 반환하는 getter 메소드가 구현되지 않아, 실패라고 출력되었습니다.
ERROR: test_name (__main__.TestShark)
----------------------------------------------------------------------
Traceback (most recent call last):
File "c:/Users/d-wook/Desktop/unittest/test.py", line 6, in setUp
self.shark = Shark()
TypeError: Can't instantiate abstract class Shark with abstract methods name
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (errors=1)
Shark 클래스에 getter 메서드를 구현하고 실행
@property
def name(self):
return self.__name
None
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
이번에는 setter 메서드를 테스트해봅니다.
2개의 테스트 중에 한 개 테스트가 실패했습니다.
def test_set_name(self):
self.shark.name = '톱상어'
None
.E
======================================================================
ERROR: test_set_name (__main__.TestShark)
----------------------------------------------------------------------
Traceback (most recent call last):
File "c:/Users/d-wook/Desktop/unittest/test.py", line 12, in test_set_name
self.shark.name = '톱상어'
AttributeError: can't set attribute
----------------------------------------------------------------------
Ran 2 tests in 0.002s
FAILED (errors=1)
Shark 클래스에 setter 메서드를 구현하고 다시 테스트합니다.
@name.setter
def name(self, name):
self.__name = name
None
..
----------------------------------------------------------------------
Ran 2 tests in 0.001s
OK
unittest.main(verbosity=2) 로 실행하게 되면 좀더 상세한 테스트 결과를 출력합니다.
import unittest
from shark import Shark
class TestShark(unittest.TestCase):
def setUp(self):
self.shark = Shark()
def test_get_name(self):
self.shark.name = '톱상어'
print(self.shark.name)
if __name__ == '__main__':
unittest.main(verbosity=2)
test_get_name (__main__.TestShark) ... 톱상어
ok
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
참고
unittest — 단위 테스트 프레임워크 — Python 3.8.5 문서
unittest — 단위 테스트 프레임워크 소스 코드: Lib/unittest/__init__.py (당신이 이미 테스트 기본 개념에 친숙하다면, assert 메서드 목록으로 건너뛰어도 좋습니다.) unittest 단위 테스트 프레임워크는 ��
docs.python.org