단위 테스트 알아보기
- 테스트 함수명은 자세하게 적는게 좋다.
테스트할 함수
def add(a:int,b:int) -> int:
return a + b
테스트 코드 #1
def test_add_int_and_int() -> None:
assert add(3,5) == 8
테스트 코드 #2
def test_add_float_and_int() -> None:
assert add(5,8.0002) == 13.0002
테스트 코드 #3
def test_add_zero_and_negative_int() -> None:
assert add(0,-3) == -3
unittest 패키지
TDD 또는 Test Case를 작성하기 위한 파이썬 내장 모듈
unittest.TestCase
를 상속받아 Custom Test Class를 정의한다.
test_
로 시작하는 함수를 정의하면 unittest가 실행되면서 해당 함수를 테스트한다.
Fixture
Fixture
란 테스트가 수행되기 이전에 준비과정 혹은 테스트가 종료된 이후에 클린업하는 과정을 의미.
예를 들어, 테스트를 위한 임시 데이터 베이스나 폴더를 생성하고 테스트 끝난 후에는 임시 데이터베이스를 삭제하고 폴더를 삭제하는 등의 일을 뜻함
setUp()
- 각 테스트 메소드를 호출하기 이전에 호출되는 메소드. 테스트 케이스가 실행될 때 마다 사용됨
tearDown()
- 각 테스트가 끝난 이후에 호출되는 메소드. 테스트 과정에서 exception이 발생해도 실행됨.
setUp
메소드가 성공했을 경우에만 호출
- 각 테스트가 끝난 이후에 호출되는 메소드. 테스트 과정에서 exception이 발생해도 실행됨.
setUpClass()
- 해당 테스트 클래스가 시작되기 이전 단 한번 호출되는 메소드.
setUp
메소드는 각 테스트 메소드 이전에 항상 호출됨. 메소드에@classmethod
라는 데코레이터 달아줘야하고 메소드 인자로cls
를 넘겨줘야 함.
- 해당 테스트 클래스가 시작되기 이전 단 한번 호출되는 메소드.
tearDownClass
- 해당 테스트 클래스가 종료된 이후 단 한번 호출되는 메소드.
tearDown
메소드는 각 테스트 메소드가 끝난 이후 항상 호출.@classmethod
라는 데코레이터 달아줘야하고 메소드 인자로cls
를 넘겨줘야 함.
- 해당 테스트 클래스가 종료된 이후 단 한번 호출되는 메소드.
예제 #1
import unittest
def add_two_num(a,b) -> None:
return a + b
class TestAdd(unitest.TestCase):
def test_add_int_and_int(self) -> None:
# 1 + 2 must be 3
self.assertEqual(add_two_num(a=1,b=2))
def test_add_zero_and_negative_int() -> None:
# 0 + -3 must be 3
self.assertEqal(add_two_num(a=0,b=-3))
if __name__ == '__main__':
unittest.main()
위 코드 실행시 아래와 같은 결과가 나온다.
----------------------------------------------------------------------
Ran 2 tests in 0.001s
OK
비교 함수는 assertEqual
외에도 assertTrue
, assertIn
등의 assert 메소드가 존재함
unittest의 assert 메소드 리스트는 여기를 참조
예제 #2
import unittest
def remove_blank(text:str) -> str:
return text.replace(' ','')
def remove_new_line(text:str) -> str:
return text.replace('\n','')
def add_semicolon(text:str) -> str:
return text + ';'
class TestFixture(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
cls.blank : str = 'he llo'
cls.new_line : str = 'he\nllo'
cls.semicolon : str = 'hello'
@classmethod
def tearDownClass(cls) -> None:
del cls.blank
del cls.new_line
del cls.semicolon
def setUp(self) -> None:
print('setUp')
def tearDown(self) -> None:
print('tearDown')
def test_remove_blank(self) -> None:
removed : str = remove_blank(text=self.blank)
self.assertNotIn(' ',removed)
def test_remove_new_line(self) -> None:
removed : str = remove_new_line(text=self.new_line)
self.assertNotIn('\n',removed)
def test_add_semicolon(self) -> None:
added : str = add_semicolon(text=self.semicolon)
self.assertEqual(added,'hello;')
if __name__ == '__main__':
unittest.main()
위 코드를 실행하면 다음과 같은 결과가 나온다
setUp
tearDown
.setUp
tearDown
.setUp
tearDown
.
----------------------------------------------------------------------
Ran 3 tests in 0.000s
OK
setUpClass
와 tearDownClass
메소드는 각각 시작과 끝에 한 번씩 실행되었고, setUp
과 tearDown
메소드는 테스트 메소드 개수와 동일하게 3번씩 실행 된 것을 확인 할 수 있다.
참조 사이트
- 파이썬 단위 테스트 모듈 unittest에 대해 알아보자 - https://sjquant.tistory.com/11