[파이썬] unittest 실시간 테스트 리포트 생성하기

소개

Unittest는 Python에서 테스트를 작성하고 실행하기 위한 기본적인 테스트 프레임워크입니다. 이 프레임워크를 사용하면 코드의 정확성을 확인하고 버그를 찾는 등 소프트웨어 개발을 보다 견고하게 할 수 있습니다.

그러나 Unittest의 기본적인 출력 형식은 사용자 친화적이지 않을 수 있습니다. 따라서, 테스트 리포트를 더 직관적이고 보기 좋게 생성하는 방법에 대해 알아보겠습니다.

실시간 테스트 리포트 생성

Unittest에서는 테스트 실행 중에 발생하는 결과를 리포트 형식으로 생성할 수 있습니다. 이를 통해 테스트가 어떻게 진행되고 실패한 부분은 무엇인지 실시간으로 확인할 수 있습니다.

아래는 Unittest에서 실시간 테스트 리포트를 생성하는 예제 코드입니다.

import unittest
from unittest.runner import TextTestRunner
from unittest.signals import registerResult

class RealtimeTestRunner(TextTestRunner):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.results = []
        registerResult(self.append_result)

    def append_result(self, result):
        self.results.append(result)

    def run(self, test):
        self.stream.writeln("Running tests...")
        super().run(test)
        self.report_results()

    def report_results(self):
        self.stream.writeln("\n\n--- Test Results ---")
        for result in self.results:
            self.stream.writeln(result)

# 테스트 클래스
class MyTestCase(unittest.TestCase):
    def test_addition(self):
        self.assertEqual(2 + 2, 4)

    def test_subtraction(self):
        self.assertEqual(4 - 2, 2)

if __name__ == '__main__':
    suite = unittest.TestSuite()
    suite.addTest(MyTestCase('test_addition'))
    suite.addTest(MyTestCase('test_subtraction'))

    runner = RealtimeTestRunner(verbosity=2)
    runner.run(suite)

위의 코드는 RealtimeTestRunner라는 커스텀 테스트 러너를 사용하여 테스트를 실행하고 결과를 실시간으로 보고하는 예제입니다. RealtimeTestRunner 클래스는 TextTestRunner를 상속하고, 결과를 저장하는 results 리스트를 추가로 가집니다. registerResult 함수는 append_result 메소드를 호출하여 결과를 results 리스트에 추가합니다.

run 메소드는 테스트 실행을 시작하기 전에 “Running tests…“라는 메시지를 출력합니다. 그리고 테스트가 실행될 때마다 append_result를 통해 결과를 저장하고, 테스트 실행이 완료된 후에 report_results를 호출하여 실시간 테스트 리포트를 출력합니다.

위 예제를 실행하면 테스트 실행 과정과 결과가 실시간으로 출력되는 것을 확인할 수 있습니다.

정리

Unittest를 사용하여 테스트를 작성하고 실행할 때, 기본적인 출력 형식보다 더 직관적이고 보기 좋은 테스트 리포트를 생성할 수 있습니다. 위 예제를 참고하여 실시간 테스트 리포트를 생성하는 방법을 익혀보세요. 이를 통해 테스트 과정을 더욱 효율적으로 관리하고 코드의 품질을 향상시킬 수 있습니다.