python mock 테스트의 예시
python2에서는pip install mock이mock 제3자 모듈을 가져올 필요가 있으며,python3에서는unittest 프레임워크에 도입되어from unittest import mock이mock 모듈을 가져올 수 있습니다.
단원 테스트에서 현재 단원만을 대상으로 테스트를 하는 것은 현재 방법이나 현재 클래스를 테스트하는 것이다. 그러나 만약에 이 방법이 다른 제3자 모듈에 의존한다면 다른 방법을 검사해야 하지 않겠는가? 그러면 단원 테스트라는 개념에 위배된다. 모든 외부 의존 구성 요소를 시뮬레이션하고 교체하여 단원 테스트의 초점을 자신에게 맞추도록 한다.
프레젠테이션을 위해fastapi로 tx와ali의 인터페이스를 모의하여 단원 테스트로 호출했습니다. 두 개의 인터페이스를 동시에 호출해야 단원 테스트를 완성할 수 있음을 볼 수 있습니다.
from unittest import TestCase, main, mock
import requests
class Request(object):
def request_tx(self):
tx_url = 'http://127.0.0.1:8000/tx'
tx_data = {"a": 1, "b": 2}
tx_result = requests.post(tx_url, json=tx_data)
tx_result = tx_result.json()
return tx_result
def request_ali(self):
ali_url = 'http://127.0.0.1:8000/ali'
ali_data = {"c": 1, "d": 2}
ali_result = requests.post(ali_url, json=ali_data)
ali_result = ali_result.json()
return ali_result
class Myproject(TestCase):
def test_api(self):
r = Request()
ali_result = r.request_ali()
tx_result = r.request_tx()
self.assertEqual(int(ali_result['result']['all_add_value']) + int(tx_result['result']['all_add_value']), 6)
'''
@File : mock_third_server.py
@Copyright : rainbol
@Date : 2020/9/28
@Desc :
'''
from fastapi import FastAPI
from pydantic import BaseModel
import uvicorn
app = FastAPI()
def add(a, b):
return a + b
# json
class TX(BaseModel):
a: int
b: int
@app.post('/tx')
def txApi(u: TX):
u.a += 1
u.b -= 1
add_result = add(u.a, u.b)
return {'status': 1, 'result': {'value_a': u.a, 'value_b': u.b, 'all_add_value': add_result}}
class Al(BaseModel):
c: int
d: int
@app.post('/ali')
def aliApi(u: Al):
u.c *= 1
u.d /= 1
add_result = add(u.c, u.d)
return {'status': 1, 'result': {'value_c': u.c, 'value_d': u.d, 'all_add_value': add_result}}
if __name__ == '__main__': #
uvicorn.run('mock_third_server:app', port=8000, debug=True)
위의 인터페이스는 조정할 수 있습니다. 만약에 txapi가 일부 이유로 되돌아오지 못한다면,ali의 인터페이스는 연결됩니다. 만약에ali인터페이스의 테스트를 실현하려면mock을 사용하여 tx의 인터페이스를 시뮬레이션해야 합니다.mock 방법 1: (같은 파일 아래/다른 파일 아래 방법 또는 클래스에 대해mock)
'''
@File : mock_third_server.py
@Copyright : rainbol
@Date : 2020/9/28
@Desc :
'''
from fastapi import FastAPI
from pydantic import BaseModel
import uvicorn
app = FastAPI()
def add(a, b):
return a + b
# json
class TX(BaseModel):
a: int
b: int
@app.post('/tx')
def txApi(u: TX):
u.a += 1
u.b -= 1
add_result = add(u.a, u.b)
raise(" ") #
return {'status': 1, 'result': {'value_a': u.a, 'value_b': u.b, 'all_add_value': add_result}}
class Al(BaseModel):
c: int
d: int
@app.post('/ali')
def aliApi(u: Al):
u.c *= 1
u.d /= 1
add_result = add(u.c, u.d)
return {'status': 1, 'result': {'value_c': u.c, 'value_d': u.d, 'all_add_value': add_result}}
if __name__ == '__main__': #
uvicorn.run('mock_third_server:app', port=8000, debug=True)
'''
@File : local_project_mock_test.py
@Copyright : rainbol
@Date : 2020/9/28
@Desc :
'''
from unittest import TestCase, main, mock
import requests
class Request(object):
def request_tx(self):
tx_url = 'http://127.0.0.1:8000/tx'
tx_data = {"a": 1, "b": 2}
tx_result = requests.post(tx_url, json=tx_data)
tx_result = tx_result.json()
return tx_result
def request_ali(self):
ali_url = 'http://127.0.0.1:8000/ali'
ali_data = {"c": 1, "d": 2}
ali_result = requests.post(ali_url, json=ali_data)
ali_result = ali_result.json()
return ali_result
class Myproject(TestCase):
def test_api(self):
r = Request()
ali_result = r.request_ali()
tx_mock = mock.Mock(
return_value={"status": 1, "result": {"value_a": 2, "value_b": 1, "all_add_value": 3}})
r.request_tx = tx_mock
tx_result = r.request_tx()
self.assertEqual(int(ali_result['result']['all_add_value']) + int(tx_result['result']['all_add_value']), 6)
if __name__ == '__main__':
main()
# 이상 request_tx 방법 mock 떨어뜨리기, 같은 파일에 쓸 수 있는 방법mock 방법 2: @patch (다른 파일의 클래스에 대해mock)
'''
@File : local_project_mock_test.py
@Copyright : rainbol
@Date : 2020/9/28
@Desc :
'''
from unittest import TestCase, main
from unittest.mock import patch
import mock_request_server
class Myproject(TestCase):
@patch("mock_request_server.Request.request_tx") # @patch
def test_api(self, _mock_tx):
_mock_tx.return_value = {'status': 1, 'result': {'value_a': 2, 'value_b': 1, 'all_add_value': 3}}
r = mock_request_server.Request()
ali_result = r.request_ali()
tx_result = r.request_tx()
print(tx_result)
self.assertEqual(int(ali_result['result']['all_add_value']) + int(tx_result['result']['all_add_value']), 6)
if __name__ == '__main__':
main()
'''
@File : mock_request_server.py
@Copyright : rainbol
@Date : 2020/9/28
@Desc :
'''
import requests
class Request:
def request_tx(self):
tx_url = 'http://127.0.0.1:8000/tx'
tx_data = {"a": 1, "b": 2}
tx_result = requests.post(tx_url, json=tx_data)
tx_result = tx_result.json()
raise(' ')
return tx_result
def request_ali(self):
ali_url = 'http://127.0.0.1:8000/ali'
ali_data = {"c": 1, "d": 2}
ali_result = requests.post(ali_url, json=ali_data)
ali_result = ali_result.json()
return ali_result
'''
@File : mock_third_server.py
@Copyright : rainbol
@Date : 2020/9/28
@Desc :
'''
from fastapi import FastAPI
from pydantic import BaseModel
import uvicorn
app = FastAPI()
def add(a, b):
return a + b
# json
class TX(BaseModel):
a: int
b: int
@app.post('/tx')
def txApi(u: TX):
u.a += 1
u.b -= 1
add_result = add(u.a, u.b)
return {'status': 1, 'result': {'value_a': u.a, 'value_b': u.b, 'all_add_value': add_result}}
class Al(BaseModel):
c: int
d: int
@app.post('/ali')
def aliApi(u: Al):
u.c *= 1
u.d /= 1
add_result = add(u.c, u.d)
return {'status': 1, 'result': {'value_c': u.c, 'value_d': u.d, 'all_add_value': add_result}}
if __name__ == '__main__': #
uvicorn.run('mock_third_server:app', port=8000, debug=True)
이상은pythonmock테스트의 예시에 대한 상세한 내용입니다.pythonmock테스트에 대한 더 많은 자료는 저희 다른 관련 글에 주목하세요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.