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
참고
'Language > Python' 카테고리의 다른 글
파이썬 동적 코드 실행(exec) : python exec not working in function (0) | 2020.08.16 |
---|---|
파이썬 반복형 객체로 순서쌍 만들기 : itertools (0) | 2020.08.15 |
파이썬 로깅( logging) 사용하기 -1 : 출력 / 파일 / 포맷 (0) | 2020.08.14 |
파이썬 엘라스틱서치(Elasticsearch) 연동 -3 : 노리(Nori) 형태소 분석기 설치 (0) | 2020.08.13 |
파이썬 쓰레드(Thread) 알아보기 - 4 : 쓰레드 동작 순서 제어를 위한 Event (0) | 2020.08.12 |