mock總所周知是模擬的意思,我們在做接口測試的時候有時候會發現部分功能依賴其他業務場景或者第三方功能或者是線上數據或者業務場景過于復雜(需要大量調用)的情況,沒有辦法通過接口調用或者做斷言,這個時候就需要mock了
python2中需要pip install mock來導入mock第三方模塊,而python3中被引入到unittest框架中,直接from unittest import mock 就可以導入mock模塊了
在單元測試中只針對當前單元做測試,就是測試當前方法或者是當前類,但是如果出現這個方法依賴其他第三方模塊,那不是還要校驗其他方法了嗎,那就違背了單元測試這個概念了,所有將外部依賴組件實現模擬并替換掉,使得單元測試的焦點放在自己身上
為了演示,用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方法一:(對于同一文件下/不同文件下的方法或者類進行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掉寫在同一文件的方法
mock方法二:@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)
以上就是python mock測試的示例的詳細內容,更多關于python mock測試的資料請關注億速云其它相關文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。