[파이썬] unittest 테스트 실패시 디버그 정보 캡쳐하기

테스트 코드를 작성할 때, unittest 모듈은 매우 유용합니다. 하지만 때로는 테스트가 실패했을 때, 추가적인 디버그 정보를 얻기 위해 추적(traceback) 정보나 변수 값 등을 캡쳐하는 것이 필요할 수도 있습니다. 이번 포스트에서는 unittest의 실패시 디버그 정보를 캡쳐하는 방법에 대해 살펴보겠습니다.

TestCase 클래스 사용하기

unittest 모듈은 TestCase 클래스를 사용하여 테스트 코드를 작성합니다. 이 클래스는 테스트 메서드를 정의하고, 테스트가 올바르게 동작하는지를 검사하는 기능을 제공합니다. 테스트 메서드는 test_로 시작해야 하며, 테스트가 실패하면 AssertionError가 발생하게 됩니다.

import unittest

class MyTest(unittest.TestCase):
    def test_addition(self):
        result = 2 + 2
        self.assertEqual(result, 5)

위의 예제 코드에서는 test_addition라는 테스트 메서드를 정의했습니다. 이 메서드는 2 + 2의 결과를 5와 비교하여 테스트를 수행합니다. 하지만 위의 테스트는 실패하게 됩니다.

실패시 디버그 정보 캡쳐하기

테스트가 실패했을 때, 추가적인 디버그 정보를 캡쳐하여 얻을 수 있습니다. 이렇게 디버그 정보를 캡쳐하면 어떤 부분에서 문제가 발생했는지 확인할 수 있으며, 문제를 해결하는 데에 도움이 됩니다.

TestCase 클래스에서는 addFailure 메서드를 사용하여 테스트의 실패 정보를 받아올 수 있습니다. 이 메서드의 첫 번째 인자로는 test 메서드의 인스턴스를 전달받습니다. 이를 통해 테스트를 수행하고 있는 테스트 메서드에 접근할 수 있습니다. 두 번째 인자로는 failure 객체를 전달받으며, 이 객체를 통해 실패 정보를 얻을 수 있습니다.

import unittest

class MyTest(unittest.TestCase):
    def test_addition(self):
        result = 2 + 2
        self.assertEqual(result, 5)
    
    def addFailure(self, test, failure):
        # 실패 정보 캡쳐
        test_method_name = test._testMethodName
        error_message = failure[1].message
        print(f"Test method '{test_method_name}' failed: {error_message}")

위의 예제 코드에서는 addFailure 메서드를 추가했습니다. 이 메서드를 사용하여 테스트 메서드의 실패 정보를 캡쳐하고 출력합니다. failure[1].message를 통해 실패 메시지를 얻을 수 있으며, test._testMethodName를 통해 실패한 테스트 메서드의 이름을 얻을 수 있습니다.

TestCase 클래스의 확장성

TestCase 클래스를 상속받아서 자신만의 테스트 클래스를 정의하고 활용할 수도 있습니다. 이를 통해 테스트의 실패 정보를 캡쳐하거나 원하는 추가 작업을 수행할 수 있습니다.

import unittest

class DebugTestCase(unittest.TestCase):
    def addFailure(self, test, failure):
        # 실패 정보 캡쳐
        test_method_name = test._testMethodName
        error_message = failure[1].message
        print(f"Test method '{test_method_name}' failed: {error_message}")

위의 예제 코드에서는 DebugTestCase라는 클래스를 정의하고, addFailure 메서드를 오버라이딩하여 실패 정보를 캡쳐합니다. 이렇게 정의한 DebugTestCase 클래스를 사용하면 테스트가 실패했을 때 원하는 추가 작업을 수행할 수 있습니다.

정리

unittest 모듈은 테스트 작성에 매우 유용한 도구입니다. 테스트가 실패했을 때, 추가적인 디버그 정보를 캡쳐하는 방법을 알아보았습니다. TestCase 클래스를 확장하거나 addFailure 메서드를 오버라이딩하여 원하는 동작을 수행할 수 있습니다. 이를 통해 문제가 발생한 부분을 신속하게 찾아 디버깅할 수 있습니다.