본문으로 바로가기

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