[파이썬] unittest 예상된 실패 처리하기

테스트를 작성할 때, 우리는 주로 예상된 결과와 비교하여 테스트를 수행합니다. 그러나 때로는 우리가 예상한대로 테스트가 실패하길 원하는 경우가 있을 수도 있습니다. 이럴 때 Unittest 프레임워크에서는 예상된 실패를 처리하는 방법을 제공합니다. 이 기능을 사용하여 코드의 특정 부분이 제대로 동작하는지 확인할 수 있습니다.

어떻게 작동하는지 이해하기

예상된 실패를 처리하려면 unittest.TestCase를 상속받는 테스트 케이스 클래스 안에서 특정 메소드를 재정의해야 합니다. 예상된 실패를 처리하기 위한 메소드로는 assertRaisesassertWarns가 있습니다.

assertRaises

assertRaises 메소드를 사용하면 특정 예외가 발생하는지 확인할 수 있습니다. 이 메소드는 2개의 인자를 받습니다. 첫 번째 인자는 예외 클래스이고, 두 번째 인자는 예외가 발생할 코드 블록이나 함수입니다.

아래는 ValueError가 발생하는지 확인하는 예제입니다.

import unittest

def divide(x, y):
    if y == 0:
        raise ValueError("Cannot divide by zero")
    return x / y

class DivideTestCase(unittest.TestCase):
    def test_divide_by_zero(self):
        self.assertRaises(ValueError, divide, 10, 0)

if __name__ == "__main__":
    unittest.main()

test_divide_by_zero 테스트 메소드에서 assertRaises를 사용하여 ValueError를 예상하고, divide 함수를 호출할 때 0으로 나누는 경우를 확인합니다.

assertWarns

assertWarns 메소드를 사용하면 특정 경고가 발생하는지 확인할 수 있습니다. 이 메소드는 경고 클래스와 경고가 발생하는 코드 블록 또는 함수를 인자로 받습니다.

아래는 DeprecationWarning 경고가 발생하는지 확인하는 예제입니다.

import unittest

def deprecated_func():
    import warnings
    warnings.warn("This function is deprecated", DeprecationWarning)

class DeprecatedTestCase(unittest.TestCase):
    def test_deprecated_warning(self):
        self.assertWarns(DeprecationWarning, deprecated_func)

if __name__ == "__main__":
    unittest.main()

test_deprecated_warning 테스트 메소드에서 assertWarns를 사용하여 DeprecationWarning을 예상하고, deprecated_func 함수를 호출할 때 경고가 발생하는지 확인합니다.

예상된 실패 메시지 확인하기

예상된 실패를 처리하여도 테스트가 실패한 경우, 우리는 실패 메시지를 출력하여 문제를 진단할 수 있습니다. 이러한 실패 메시지는 assertRaisesassertWarns 메소드에 msg 인자로 추가할 수 있습니다.

import unittest

def custom_exception_func():
    raise Exception("Custom exception message")

class CustomTestCase(unittest.TestCase):
    def test_custom_exception(self):
        with self.assertRaises(Exception, msg="Expected exception"):
            custom_exception_func()

if __name__ == "__main__":
    unittest.main()

test_custom_exception 테스트 메소드에서 assertRaises를 사용했고, msg 인자로 “Expected exception”이라는 메시지를 지정했습니다. 이 메시지는 예상된 실패가 발생한 경우에 출력됩니다.

결론

Unittest 프레임워크에서 제공하는 assertRaisesassertWarns 메소드를 사용하면 예상된 실패를 처리하는 테스트 케이스를 작성할 수 있습니다. 이를 통해 특정 예외나 경고가 발생하는지 확인하고, 문제의 원인을 신속하게 진단할 수 있습니다.