Testing

파이썬 Unit Testing Framework

알로그 2019. 12. 31. 23:04
반응형

Python unit testing framework

파이썬 unit testing 표준 라이브러리인 unittest에 대해 알아보자.

JUnit에서 영감을 얻었으며 다른 언어의 주 unit testing framework와 유사하다고 한다.

 

test automation과 setup, shutdown 공유, reporting framework 등을 지원한다.

자세히 알아보기전에 몇 가지 중요한 용어는 다음과 같다.

  • test fixture : 테스트 수행하는데 필요한 준비 및 정리 작업을 지원함 (temporary or proxy databases, directories 등)
  • test case : 테스트를 수행하고자 하는 각각의 unit test case
  • test suite : test case의 모음, 여러 test cases를 한번에 실행할 때 사용됨
  • test runner : 테스트 실행을 조율하고 user에게 결과(report)를 제공해줌

 

Script Sample (Ref. https://docs.python.org/3/library/unittest.html#module-unittest)

import unittest

class TestStringMethods(unittest.TestCase):

    def test_upper(self):
        self.assertEqual('foo'.upper(), 'FOO')

    def test_isupper(self):
        self.assertTrue('FOO'.isupper())
        self.assertFalse('Foo'.isupper())

    def test_split(self):
        s = 'hello world'
        self.assertEqual(s.split(), ['hello', 'world'])
        # check that s.split fails when the separator is not a string
        with self.assertRaises(TypeError):
            s.split(2)

if __name__ == '__main__':
    unittest.main()

클래스 기반으로 작성해야 하며 unittest.TestCase를 상속받아서 스크립트를 구현해야 한다.

그리고 각 test case에 속하는 함수는 반드시 test로 시작해야 한다.

 * 테스트 실행순서는 test 함수 이름순서대로 실행됨

 

Command-line Interface

아래처럼 unittest module을 이용해서 modules, classes, test method를 각각 실행할 수 있다.

 

Test Discover

Unittest는 한번에 여러 테스트를 수행하기 위해 simple test discover를 지원한다.

이를 위해선 모든 테스트 파일이 프로젝트 최상위 디렉토리에서 importable 해야한다.

참고로 discover를 빼도 같은 의미로 동작한다.

 

setUp & tearDown

setUp과 tearDown은 각 개별 testcase를 실행할 때 test fixture로 사용된다.

setUp, tearDown, __init__()은 각 테스트마다 호출된다.

따라서 setUp에는 주로 공통으로 시작하는 부분, 셋팅되어야 하는 부분을 작성하고, tearDown은 close와 같이 정리되는 작업을 작성한다.

호출되는 프로세스는 예를 들어 테스트 함수가 testcase1, testcase2가 있다면..

setUp -> testcase1 -> tearDown -> setUp -> testcase2 -> tearDown 순으로 호출된다.

 

TestSuite

위에서 언급한대로 test case들은 테스트 하는 기능에 따라 그룹화하는 것을 권장한다.

unittest framework에서는 아래와 같이 TestSuite 클래스를 이용할 수 있다.

def suite():
    suite = unittest.TestSuite()
    suite.addTest(WidgetTestCase('test_default_widget_size'))
    suite.addTest(WidgetTestCase('test_widget_resize'))
    return suite

if __name__ == '__main__':
    runner = unittest.TextTestRunner()
    runner.run(suite())

 

Assert Method

Method Description
assertEqual(a, b) a == b
assertNotEqual(a, b) a != b
assertTrue(x) bool(x) is True
assertFalse(x) bool(x) is False
assertIs(a, b) a is b
assertIsNot(a, b) a is not b
assertIsNone(x) x is None
assertIsNotNone(x) x is not None
assertIn(a, b) a in b
assertNotIn(a, b) a not in b
assertIsInstance(a, b) isinstance(a, b)
assertNotIsInstance(a, b) not isinstance(a, b)

 

반응형