Python

[Python] unittest 사용법 (python test code)

minimin2 2022. 6. 18. 22:29
반응형

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() 메소드를 통해서 테스트 후에 실행하는 함수를 작성할 수 있다.
import unittest

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

해당 테스트는 macOS(darwin)에서 진행했으므로 test2는 condition이 참이여서 skip되었고, test3는 win으로 시작하지 않기 때문에 skip되었다.

주요 assert 함수

assertEqual(a, b)a==b 비교
assertNotEqual(a, b)a!=b 비교
assertTrue(expr)bool(expr) is True 비교
assertFalse(expr)bool(expr) is False 비교
assertIs(a, b)a is b 비교
assertIsNot(a, b)a is not b 비교
assertIsNone(expr)expr is None 비교
assertInNotNone(expr)expr is not None 비교
assertIn(member, container)member in container 비교
assertNotIn(member, container)member not in container 비교
assertIsInstance(obj, cls)isinstance(obj, cls) 비교
assertNotIsInstance(obj, cls)not isinstance(obj, cls) 비교

참고자료

[1] https://docs.python.org/ko/3/library/unittest.html


Uploaded by N2T

반응형