[python] unittest.TestCase와 Mock 객체의 상호작용 방식

이 글에서는 Python의 unittest 모듈에서 제공하는 TestCase 클래스와 Mock 객체를 이용하여 테스트케이스를 작성하는 방법과 두 객체의 상호작용 방식에 대해 알아보겠습니다.

unittest.TestCase 클래스

unittest 모듈은 테스트를 작성하고 실행하기 위한 기본적인 도구들을 제공합니다. TestCase 클래스는 테스트케이스를 작성할 때 사용되며, 테스트 메소드를 정의하고 각각의 테스트 케이스를 실행하는 데 활용됩니다.

import unittest

class MyTestCase(unittest.TestCase):
    def test_addition(self):
        self.assertEqual(1 + 1, 2)

위의 코드는 MyTestCase 클래스를 정의하고, test_addition 메소드를 통해 덧셈 테스트를 정의한 예시입니다.

Mock 객체

Mock 객체는 테스트하는 동안 다른 객체들과의 상호작용을 대신하는데 사용됩니다. 현실의 객체를 테스트하는 동안 대체하여 사용할 수 있으며, 메서드 호출 및 반환값을 조작하여 테스트 시나리오를 재현할 수 있습니다.

from unittest.mock import Mock

# 인자로 받은 값에 10을 더한 값을 반환하는 mock 객체 생성
mock_obj = Mock(return_value=10)
result = mock_obj(5)  # 결과: 10

위의 코드는 return_value 매개변수를 사용하여 Mock 객체의 반환값을 설정하고, 해당 Mock 객체를 호출한 후 반환되는 값을 보여주는 예시입니다.

TestCase와 Mock 객체의 상호작용

TestCase 클래스를 이용하여 단위 테스트를 작성할 때, Mock 객체를 활용하여 외부 의존성을 모의(mock)화하여 테스트할 수 있습니다. 예를 들어, 파일 입출력, 네트워크 통신, 혹은 외부 API 호출과 같은 것들을 테스트할 때 Mock 객체를 사용하여 이들을 정상적으로 동작하는 것처럼 보이게 할 수 있습니다.

from unittest.mock import Mock
from my_module import send_email

class MyTestCase(unittest.TestCase):
    def test_send_email(self):
        mock_email = Mock()
        send_email(mock_email, "example@example.com", "Test Subject", "Test Body")
        mock_email.send.assert_called_once_with("example@example.com", "Test Subject", "Test Body")

위의 코드는 send_email 함수가 외부 의존성으로서 mock_email 객체를 받아와 이를 이용하여 이메일을 보내는지를 검증하는 예시입니다.

마무리

unittest.TestCase 클래스와 Mock 객체를 이용하면 단위 테스트를 작성하고 외부 의존성을 모의화하여 테스트하는 것이 가능해집니다. 이를 통해 안정적이고 확신할 수 있는 코드를 작성하는 데 도움이 됩니다.

참고 문헌: Python unittest 공식 문서