[파이썬] unittest mock 객체의 리턴값 설정하기

테스트 코드를 작성할 때, 종종 외부 의존성이나 다른 함수에서 호출된 결과 값을 모킹(mocking)하여 테스트를 수행해야 할 때가 있습니다. Python에서는 unittest.mock 모듈을 사용하여 테스트 중에 모킹(mocking)을 쉽게 구현할 수 있습니다. 이번 블로그 포스트에서는 unittest.mock 모듈을 사용하여 mock 객체의 리턴값을 설정하는 방법에 대해 알아보겠습니다.

unittest.mock 모듈 소개

unittest.mock 모듈은 Python 3.3부터 unittest 모듈에 포함되어 기본적으로 제공되는 모듈입니다. 이 모듈을 사용하면 테스트 중에 다른 객체를 가로채고 원하는 대로 동작하게 할 수 있습니다. 이를 통해 외부 의존성을 간단하게 모킹하여 테스트를 수행할 수 있습니다.

unittest.mock를 사용한 모킹 예제

아래는 unittest.mock를 사용하여 mock 객체의 리턴값을 설정하는 예제 코드입니다. 예제에서는 requests 모듈을 사용하는 get_data 함수를 테스트하고자 합니다. 이 함수는 외부 API에 요청을 보내어 데이터를 가져오는 역할을 합니다.

import unittest
from unittest.mock import Mock

import requests

def get_data():
    response = requests.get('https://api.example.com/data')
    if response.status_code == 200:
        return response.json()
    else:
        return None

class MockTestCase(unittest.TestCase):
    def test_get_data_success(self):
        mock_response = Mock()
        mock_response.status_code = 200
        mock_response.json.return_value = {'data': 'mocked_data'}
        requests.get = Mock(return_value=mock_response)
        
        result = get_data()
        
        self.assertEqual(result, {'data': 'mocked_data'})
    
    def test_get_data_failure(self):
        mock_response = Mock()
        mock_response.status_code = 404
        requests.get = Mock(return_value=mock_response)
        
        result = get_data()
        
        self.assertEqual(result, None)

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

위의 예제 코드에서 unittest.mock 모듈의 Mock 클래스를 사용하여 mock_response라는 테스트용 mock 객체를 생성합니다. mock_response.status_codemock_response.json.return_value를 설정하여 원하는 리턴값을 설정합니다. 그리고 requests.get 함수를 Mock 객체로 대체하여, 해당 함수가 호출될 때 mock 객체를 리턴하도록 설정합니다.

테스트 함수에서는 get_data 함수를 호출하고, 예상 결과와 비교하는 단언(assert)을 수행합니다. mock 객체를 사용하여 get_data 함수를 호출하면, 실제로 API 요청을 보내지 않고 mock 객체의 설정값을 리턴하므로 테스트 결과를 예측 가능하게 만들어줍니다.

결론

unittest.mock 모듈을 사용하면 외부 의존성이나 다른 함수의 리턴값을 모킹하여 테스트를 수행할 수 있습니다. 이를 통해 테스트 코드의 안정성과 예측 가능성을 높일 수 있습니다. 위 예제 코드를 참고하여 자신의 테스트 코드에 모킹을 적용해보세요.