[python] doctest를 사용하여 모의 객체를 테스트하는 방법은?

doctest는 Python의 내장 라이브러리로, 주석 안에 작성된 예제 코드를 실행하여 테스트하는 기능을 제공합니다. 이를 활용하여 모의 객체(Mock Object)를 테스트하는 것도 가능합니다. 모의 객체는 실제 객체를 대체하여 테스트 시에 사용되는 가짜 객체로, 특정 상황을 시뮬레이션하거나 테스트에 필요한 메서드의 동작을 조작할 수 있습니다.

unittest.mock 모듈을 사용하여 모의 객체를 생성하고 doctest를 통해 테스트하는 방법을 알아보겠습니다.

먼저, 다음의 함수를 작성해보겠습니다.

def get_data_from_api(api_url):
    """
    API를 통해 데이터를 가져오는 함수

    >>> api_url = 'https://api.example.com/data'
    >>> get_data_from_api(api_url)
    'Mocked API Response'
    """
    response = requests.get(api_url)
    return response.text

이 함수는 주어진 API URL을 통해 데이터를 가져오는 함수입니다. 이 함수를 테스트하기 위해 unittest.mock 모듈의 patch를 사용하여 requests.get() 메서드를 모의 객체로 대체할 수 있습니다.

import unittest.mock as mock

def test_get_data_from_api():
  with mock.patch('requests.get') as mock_get:
    api_url = 'https://api.example.com/data'
    mock_get.return_value.text = 'Mocked API Response'
    result = get_data_from_api(api_url)
    assert result == 'Mocked API Response'

위의 코드에서 mock.patch 함수 내에 requests.get을 전달하여 requests.get 메서드를 모의 객체로 대체하고, 모의 객체의 return_value 속성을 사용하여 모의 응답을 설정합니다. 이렇게 설정된 모의 응답을 통해 get_data_from_api() 함수를 테스트할 수 있습니다.

test_get_data_from_api() 함수를 실행하면, 모의 객체를 사용하여 get_data_from_api() 함수를 테스트하게 됩니다.

이와 같이 doctest와 모의 객체를 조합하여 테스트를 작성할 수 있습니다. 주석으로 작성된 예제 코드를 실행하여 테스트하므로 코드와 테스트가 함께 작성되어 있어 테스트의 가독성이 좋아집니다.

더 많은 doctest와 모의 객체 사용법에 대해서는 공식 Python 문서를 참조하시기 바랍니다.

Python 공식 문서 - doctest

Python 공식 문서 - unittest.mock