테스트 코드를 작성할 때, 종종 외부 의존성이나 다른 함수에서 호출된 결과 값을 모킹(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_code
와 mock_response.json.return_value
를 설정하여 원하는 리턴값을 설정합니다. 그리고 requests.get
함수를 Mock
객체로 대체하여, 해당 함수가 호출될 때 mock 객체를 리턴하도록 설정합니다.
테스트 함수에서는 get_data
함수를 호출하고, 예상 결과와 비교하는 단언(assert)을 수행합니다. mock 객체를 사용하여 get_data
함수를 호출하면, 실제로 API 요청을 보내지 않고 mock 객체의 설정값을 리턴하므로 테스트 결과를 예측 가능하게 만들어줍니다.
결론
unittest.mock
모듈을 사용하면 외부 의존성이나 다른 함수의 리턴값을 모킹하여 테스트를 수행할 수 있습니다. 이를 통해 테스트 코드의 안정성과 예측 가능성을 높일 수 있습니다. 위 예제 코드를 참고하여 자신의 테스트 코드에 모킹을 적용해보세요.