일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 데이터구조
- 웹개발
- 2
- Yes
- 딥러닝
- 데이터분석
- 프로그래밍언어
- 코딩
- 알고리즘
- 빅데이터
- 소프트웨어
- 사이버보안
- 데이터과학
- 소프트웨어공학
- 컴퓨터비전
- 인공지능
- 클라우드컴퓨팅
- 파이썬
- 네트워크보안
- 머신러닝
- 네트워크
- 버전관리
- 데이터베이스
- 자바스크립트
- I'm Sorry
- 컴퓨터공학
- 프로그래밍
- 컴퓨터과학
- 보안
- 자료구조
- Today
- Total
스택큐힙리스트
요청과 응답을 어떻게 모의할 수 있나요? 본문
저는 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 테스트를 수행하는 데 있어 매우 유용하며, 실패한 테스트를 해결해나가는 일반적인 방법입니다. 따라서 테스트 코드 작성 시 필수적으로 고려되어야합니다.