[파이썬] unittest 픽스처(Fixture)의 이해 및 활용

테스트를 작성할 때, 테스트 케이스들은 여러 번 반복해야 할 수 있습니다. 테스트를 실행하기 전에 필요한 설정이나 데이터를 준비하고, 테스트를 실행한 후에는 정리를 해야 하는 경우도 있습니다. 이런 준비와 정리 작업을 픽스처(Fixture)라고 합니다.

Python에서는 unittest 모듈을 사용하여 테스트를 작성할 수 있습니다. 이 모듈은 테스트 케이스와 픽스처를 지원하며, 테스트를 좀 더 구조화하고 간결하게 작성할 수 있게 도와줍니다.

테스트 케이스 작성하기

먼저, unittest 모듈에서 제공하는 TestCase 클래스를 상속받는 테스트 케이스를 작성해야 합니다. 테스트 케이스 클래스는 각 테스트 메서드를 정의하는데, 이 메서드들은 실제 테스트를 수행하는 로직을 담고 있습니다.

import unittest

class MyTestCase(unittest.TestCase):
    def test_something(self):
        # 테스트를 수행하는 로직 작성
        self.assertEqual(2 + 2, 4)

위의 예제에서는 test_something 메서드에서 2와 2를 더한 결과가 4인지를 확인하는 단순한 테스트를 작성했습니다. assertEqual 메서드를 사용하여 값의 동일성을 검사하고, 이를 통해 테스트가 성공했는지 여부를 판단합니다.

픽스처 작성하기

테스트를 작성할 때, 테스트 케이스들은 종종 동일한 작업을 실행해야 할 수 있습니다. 이러한 경우, 테스트 케이스에서 반복되는 준비 작업을 공통으로 작성하고, 정리 작업도 마찬가지로 공통으로 작성할 수 있습니다.

unittest 모듈에서는 setUp 메서드와 tearDown 메서드를 통해 이러한 공통 작업을 수행할 수 있습니다. setUp 메서드는 각 테스트 메서드가 실행되기 전에 호출되며, 테스트를 준비하는데 필요한 작업을 수행합니다. tearDown 메서드는 각 테스트 메서드가 실행된 후에 호출되며, 테스트 실행 후 정리 작업을 수행합니다.

import unittest

class MyTestCase(unittest.TestCase):
    def setUp(self):
        # 테스트 준비 작업 수행
        self.value = 10

    def tearDown(self):
        # 테스트 정리 작업 수행
        self.value = None

    def test_something(self):
        # 테스트를 수행하는 로직 작성
        result = self.value + 5
        self.assertEqual(result, 15)

위의 예제에서는 setUp 메서드에서 self.value 변수를 10으로 초기화하고, tearDown 메서드에서 self.value 변수를 None으로 초기화합니다. 이렇게 작성된 픽스처가 각 테스트 메서드의 실행 전후에 호출되며, 해당 메서드에서는 self.value 변수에 접근하여 테스트를 수행할 수 있습니다.

기타 픽스처 관련 메서드

unittest.TestCase 클래스에서는 setUpClass, tearDownClass, setUpModule, tearDownModule과 같은 추가적인 픽스처 관련 메서드를 제공합니다. 이러한 메서드들은 테스트 클래스 전체나 테스트 모듈 전체의 준비와 정리 작업을 수행하는데 사용됩니다.

예를 들어, setUpClass 메서드는 해당 테스트 클래스의 모든 테스트 메서드가 실행되기 전에 호출되며, 클래스 수준의 작업을 수행할 수 있습니다. 마찬가지로, tearDownClass 메서드는 해당 테스트 클래스의 모든 테스트 메서드가 실행된 후에 호출되며, 클래스 수준의 정리 작업을 수행할 수 있습니다.

import unittest

class MyTestCase(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        # 클래스 수준의 준비 작업 수행
        cls.data = [1, 2, 3, 4]

    @classmethod
    def tearDownClass(cls):
        # 클래스 수준의 정리 작업 수행
        cls.data = None

    def test_something(self):
        # 테스트를 수행하는 로직 작성
        self.assertEqual(len(self.data), 4)

위의 예제에서는 setUpClass 메서드에서 data 변수를 초기화하고, tearDownClass 메서드에서 data 변수를 None으로 초기화합니다. test_something 메서드에서는 self.data 변수에 접근하여 테스트를 수행합니다.

결론

unittest 모듈에서 제공하는 픽스처 기능을 활용하면, 테스트 작성 시 반복되는 준비와 정리 작업을 간편하게 처리할 수 있습니다. 이를 통해 테스트 코드를 더 구조화하고 가독성을 높일 수 있으며, 유지 및 보수도 용이해집니다. 효율적인 테스트 작성을 위해 픽스처의 이해와 활용에 대해 더 자세히 공부해보세요.