[파이썬] unittest 테스트 스위트 실행 순서 커스터마이징

unittest는 Python에서 많이 사용되는 테스트 프레임워크입니다. 테스트 스위트는 테스트를 그룹화하는 방법이며, 테스트 메소드는 각각의 테스트 케이스를 나타냅니다. unittest는 기본적으로 메소드명의 알파벳 순서대로 테스트를 실행합니다.

그러나 때로는 테스트 케이스의 실행 순서를 변경하거나 특정 순서로 정렬해야 할 때가 있습니다. 이 글에서는 unittest에서 테스트 스위트의 실행 순서를 커스터마이징하는 방법에 대해 알아보겠습니다.

1. 테스트 케이스를 번호 또는 우선순위로 정렬하기

unittest에서는 TestLoader() 클래스를 사용하여 테스트 케이스를 로딩하고 실행할 수 있습니다. TestLoader() 클래스에는 sortTestMethodsUsing() 메소드가 있어, 이를 사용하여 테스트 케이스의 실행 순서를 정의할 수 있습니다.

import unittest

class MyTestCase(unittest.TestCase):
    def test_b(self):
        # Test case B

    def test_a(self):
        # Test case A

    def test_c(self):
        # Test case C

# 테스트 케이스를 로딩할 때 테스트 메소드를 번호로 정렬
loader = unittest.TestLoader()
loader.sortTestMethodsUsing(lambda methodName: int(methodName[5]))

# 테스트 케이스 실행
suite = loader.loadTestsFromTestCase(MyTestCase)
unittest.TextTestRunner(verbosity=2).run(suite)

위의 예제에서 TestLoader()sortTestMethodsUsing() 메소드를 사용하여 테스트 메소드를 번호(앞의 ‘test_’ 이후의 숫자)로 정렬하고 있습니다. 이 경우, 테스트 스위트가 순서대로 ‘test_1’, ‘test_2’, ‘test_3’ 순으로 실행될 것입니다.

2. 테스트 케이스를 데코레이터로 정의하여 실행 순서 변경하기

또 다른 방법으로는 테스트 케이스를 데코레이터로 정의하여 실행 순서를 변경하는 방법이 있습니다. 이를 위해 unittest 모듈의 TestSuite() 클래스를 사용할 수 있습니다.

import unittest

# 테스트 케이스를 데코레이터로 정의하여 실행 순서 변경
def order_decorator(order):
    def decorator(test_case):
        setattr(test_case, '__test_order__', order)
        return test_case
    return decorator

class MyTestCase(unittest.TestCase):
    @order_decorator(3)
    def test_c(self):
        # Test case C

    @order_decorator(1)
    def test_a(self):
        # Test case A

    @order_decorator(2)
    def test_b(self):
        # Test case B

# 테스트 케이스 실행
suite = unittest.TestSuite()
suite.addTests(unittest.defaultTestLoader.loadTestsFromTestCase(MyTestCase))
unittest.TextTestRunner(verbosity=2).run(suite)

위의 예제에서 MyTestCase 클래스의 각 테스트 메소드에 order_decorator() 데코레이터를 사용하여 실행 순서를 지정하고 있습니다. 테스트 메소드에는 __test_order__ 속성이 추가되어 있으며, 이 속성을 기준으로 TestSuite() 클래스가 테스트 스위트를 실행합니다.

결론

unittest에서 테스트 스위트 실행 순서를 커스터마이징하는 방법을 알아보았습니다. 테스트 케이스를 번호 또는 우선순위로 정렬하거나, 테스트 케이스를 데코레이터로 정의하여 실행 순서를 변경할 수 있습니다. 이러한 기능을 사용하여 테스트를 보다 효율적으로 관리할 수 있습니다.