본문 바로가기
IT/Python

[Python] python test code unittest 사용법

by 쿠이모 2023. 10. 31.

unittest

python 테스트 코드 작성 내장 패키지. 내장패키지로 따로 설치할 필요 없음.

import 후 사용 가능

테스트는 최대한 작은 단위로 쪼개서 하는 것이 유지보수 차원에서 좋다. (프로젝트 확장성 고려)

 

사용법

- unittest.TestCase를 상속받는 테스트 클래스 생성

- 클래스 메소드로 테스트 할 코드 작성

- assert*() 등의 테스트 메소드를 이용하여 원하는 코드가 동작하는지 체크

- assert에서 실패하면 에러로 취급하여 테스트 실패

- 아래 각각의 메소드는 독립적으로 테스트되며 서로 영향을 주지 않는다.

- 전체를 실행할 시에 테스트 메서드의 순서는 문자열 이름순으로 동작. (스프링과 차이점)

 

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()

위 코드를 실행하여 에러가 없다면 아래와 같이 OK가 출력

 

테스트 전, 후 동작 코드

- setUp() 메서드를 통해 테스트 전에 실행하는 함수를 작성할 수 있다.

- tearDown() 메서드를 통해 테스트 후에 실행하는 함수를 작성할 수 있다.

class TestStringMethods(unittest.TestCase):

    def setUp(self) -> None:
        print('start')
    def tearDown(self) -> None:
        print('end')

    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()

위의 코드를 실행하면 각각의 세 가지 메서드를 테스트 하기 전에 start를 출력하고 테스트 후에 end를 출력

 

테스트 skip하기

unittest의 skip decoration으로 해당 메서드 테스트를 스킵할 수 있다.

- @unittest.skip(reason):조건없이 테스트를 건너 뛴다. reason은 str 값으로 건너뛴 이유를 작성한다.

- @unittest.skiplf(condition, reason): condition이 참이면 테스트를 건너 뛴다.

- @unittest.skipUnless(condition, reason): condition이 참이 아니면 테스트를 건너 뛴다.

import sys
import unittest


class TestStringMethods(unittest.TestCase):

    @unittest.skip("skip no reason.")
    def test1(self):
        pass

    @unittest.skipIf(sys.platform.startswith("darwin"), "requires darwin os")
    def test2(self):
        pass

    @unittest.skipUnless(sys.platform.startswith("win"), "requires windows")
    def test3(self):
        pass


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

해당 테스트는 windows에서 진행

 

 

참조 https://docs.python.org/ko/3/library/unittest.html