스택큐힙리스트

요청과 응답을 어떻게 모의할 수 있나요? 본문

카테고리 없음

요청과 응답을 어떻게 모의할 수 있나요?

스택큐힙리스트 2023. 4. 20. 08:37
반응형

저는 Python requests 모듈을 모방하기 위해 Pythons mock package을 사용하려고 합니다. 아래 시나리오에서 작동하기 위한 기본 호출은 무엇인가요?

내 views.py에는 매번 다른 응답을 가진 다양한 requests.get() 호출을 수행하는 함수가 있습니다.

def myview(request):

res1 = requests.get('aurl')

res2 = request.get('burl')

res3 = request.get('curl')

제 시험 수업에서는 이와 같은 것을 하고 싶지만, 정확한 메소드 호출 방법을 알 수 없습니다.

단계 1:

# Mock the requests module

# when mockedRequests.get('aurl') is called then return 'a response'

# when mockedRequests.get('burl') is called then return 'b response'

# when mockedRequests.get('curl') is called then return 'c response'

2단계:

내 견해를 호출해주세요.

3단계:

검증 - 응답에 'a response', 'b response', 'c response'가 포함되어 있는지 확인합니다.

1단계 (requests 모듈 모의)를 어떻게 완료할 수 있나요?

답변 1

이렇게하면됩니다 (이 파일을 그대로 실행할 수 있습니다):

import requests

import unittest

from unittest import mock

# This is the class we want to test

class MyGreatClass:

def fetch_json(self, url):

response = requests.get(url)

return response.json()

# This method will be used by the mock to replace requests.get

def mocked_requests_get(*args, **kwargs):

class MockResponse:

def __init__(self, json_data, status_code):

self.json_data = json_data

self.status_code = status_code

def json(self):

return self.json_data

if args[0] == 'http://someurl.com/test.json':

return MockResponse({key1: value1}, 200)

elif args[0] == 'http://someotherurl.com/anothertest.json':

return MockResponse({key2: value2}, 200)

return MockResponse(None, 404)

# Our test case class

class MyGreatClassTestCase(unittest.TestCase):

# We patch 'requests.get' with our own method. The mock object is passed in to our test case method.

@mock.patch('requests.get', side_effect=mocked_requests_get)

def test_fetch(self, mock_get):

# Assert requests.get calls

mgc = MyGreatClass()

json_data = mgc.fetch_json('http://someurl.com/test.json')

self.assertEqual(json_data, {key1: value1})

json_data = mgc.fetch_json('http://someotherurl.com/anothertest.json')

self.assertEqual(json_data, {key2: value2})

json_data = mgc.fetch_json('http://nonexistenturl.com/cantfindme.json')

self.assertIsNone(json_data)

# We can even assert that our mocked method was called with the right parameters

self.assertIn(mock.call('http://someurl.com/test.json'), mock_get.call_args_list)

self.assertIn(mock.call('http://someotherurl.com/anothertest.json'), mock_get.call_args_list)

self.assertEqual(len(mock_get.call_args_list), 3)

if __name__ == '__main__':

unittest.main()

중요 노트: 만약 당신의 MyGreatClass 클래스가 다른 패키지에 존재한다면, my.great.package 대신에 'request.get'을 모킹해 주어야 합니다. 이 경우 당신의 테스트 케이스는 다음과 같이 보일 것입니다:

import unittest

from unittest import mock

from my.great.package import MyGreatClass

# This method will be used by the mock to replace requests.get

def mocked_requests_get(*args, **kwargs):

# Same as above

class MyGreatClassTestCase(unittest.TestCase):

# Now we must patch 'my.great.package.requests.get'

@mock.patch('my.great.package.requests.get', side_effect=mocked_requests_get)

def test_fetch(self, mock_get):

# Same as above

if __name__ == '__main__':

unittest.main()

즐겨요!

답변 2

API 테스트 작업에서는 종종 requests와 response를 모킹(mocking)하여 테스트하는 것이 유용할 때가 있습니다. 모킹은 실제 API호출을 시도하기 전에 요청과 응답의 동작을 시뮬레이트 할 수 있는 것으로, 네트워크나 외부 서비스에 의존하지 않고도 코드의 일부분을 테스트할 수 있습니다.

requests와 response를 모킹하기 위해서는 일반적으로 테스트 프레임워크에서 제공하는 특별한 라이브러리를 사용해야 합니다. 이 라이브러리를 사용하면, HTTP 요청 및 응답을 합성하고, 예상되는 동작을 정의할 수 있습니다.

예를 들어, requests 라이브러리의 get 메서드는 다음과 같이 모킹할 수 있습니다:

```python

from unittest.mock import Mock

response = Mock()

response.status_code = 200

response.json.return_value = {key: value}

requests.get = Mock(return_value=response)

assert requests.get(http://example.com).status_code == 200

assert requests.get(http://example.com).json() == {key: value}

```

위의 코드에서, `Mock` 클래스를 사용하여 `response` 객체를 생성합니다. 이 객체를 사용하여 `status_code` 및 `json` 값 등을 설정할 수 있습니다. 이후에, `requests.get` 함수가 참조하는 객체를 모킹하여, 응답 객체를 반환합니다.

이를 통해 디버깅 시에도 빠른 속도로 테스트를 수행할 수 있습니다. 즉, API가 작동하지 않을 경우에도, requests와 response의 작동을 확인할 수 있습니다. 이를 통해, API를 개선하면서도 사용자에게 불편을 겪이지 않도록 할 수 있습니다. 예를 들어, 기존에 설계된 API의 Response Code를 변경하여, 응답을 받지 못하는 문제를 수정할 때, 내부적으로 수정하는 방안이 필요한데, requests와 response를 모킹함으로써, 사용자 로직의 변경 없이 API의 Response Code를 수정하거나 새로운 조치를 취할 수 있습니다.

requests와 response를 모킹하는 것은 API 테스트를 수행하는 데 있어 매우 유용하며, 실패한 테스트를 해결해나가는 일반적인 방법입니다. 따라서 테스트 코드 작성 시 필수적으로 고려되어야합니다.

반응형
Comments