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