unittest

기초

TDD (Test Driven Development)를 하기 위한 파이썬 표준 라이브러리이다.

unittest.TestCase를 상속받아 Custom Test Class를 정의한다.

test_로 시작하는 함수를 정의하면 unittest가 실행되면서 해당 함수를 테스트한다.

예제


import unittest

def add_two_numbers(a, b):
    return a + b

class TestAdd(unittest.TestCase):
    def test_numbers_3_4(self):
        # 3+4 must be 7
        self.assertEqual(add_two_numbers(3, 4), 7)

    def test_numbers_0_0(self):
        # 0+0 must be 0
        self.assertEqual(add_two_numbers(0, 0), 0)

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

위의 코드를 실행하면 다음과 같은 결과가 나온다.

----------------------------------------------------------------------
Ran 2 tests in 0.001s

OK

assertEqual외에도 assertNotEqual, assertTrue 등 assert 메소드가 있다. <a href="https://wikidocs.net/16107">여기</a>를 참고하자.

Fixture

Fixture란 테스트가 수행되기 이전에 준비과정 혹은 테스트가 종료된 이후에 클린업하는 과정을 말한다. 예를 들어, 테스트를 위한 임시 데이터 베이스나 폴더를 생성하고 테스트가 끝난후에 이들을 정리하는 등의 일이다.

  • setUp()

    • 각 테스트 메소드를 호출하기 이전에 호출되는 메소드이다. 테스트 케이스가 실행될 때 마다 사용된다.
  • tearDown()

    • 각 테스트가 끝난 이후에 호출되는 메소드이다. 테스트 과정에서 exception이 발생해도 실행된다. setUp 메소드가 성공했을 경우에만 호출된다.
  • setUpClass()

    • 해당 테스트 클래스가 시작되기 이전 단 한번 호출되는 메소드이다. setUp메소드는 각 테스트 메소드 이전에 항상 호출 된다. 메소드에 @classmethod라는 데코레이터를 달아줘야하고 메소드 인자로 cls를 넘겨줘야한다.
  • tearDownClass()

    • 해당 테스트 클래스가 종료된 이후 단 한번 호출되는 메소드이다. tearDown메소드는 각 테스트 메소드가 끝난 이후 항상 호출된다. 메소드에 @classmethod라는 데코레이터를 달아줘야하고 메소드 인자로 cls를 넘겨줘야한다.

예제

import unittest

def remove_blank(text):
    return text.replace(' ', '')

def remove_new_line(text):
    return text.replace('\n', '')

def add_semicolon(text):
    return text + ';'

class TestFixture(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        print('setUpClass')

    @classmethod
    def tearDownClass(cls):
        print('tearDownClass')

    def setUp(self):
        print('setUp')

    def tearDown(self):
        print('tearDown')

    def test_remove_blank(self):
        text = "Hi, I'm SJ Quant"
        removed = remove_blank(text)
        self.assertNotIn(' ', removed)

    def test_remove_new_line(self):
        text = "Hi, I'm SJ Quant\nNice to meet you."
        removed = remove_new_line(text)
        self.assertNotIn('\n', removed)

    def test_add_semicolon(self):
        text = "console.log('Hello, World')"
        added = add_semicolon(text)
        self.assertEqual(added, "console.log('Hello, World');")

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

아래의 코드를 실행하면 다음과 같은 결과가 나온다.

setUpClass
setUp
tearDown
.setUp
tearDown
.setUp
tearDown
.tearDownClass

----------------------------------------------------------------------Ran 3 tests in 0.005s

OK

setUpClasstearDownClass메소드는 각각 시작과 끝에 한 번씩 실행되었고 setUptearDown메소드는 테스트 메소드 개수와 동일하게 3번씩 실행 된 것을 확인 할 수 있다.

참조 사이트