前言
今天跟小伙伴們一起來學習一下如何編寫Python腳本進行mock測試。
什么是mock?
-
測試樁,模擬被測對象的返回,用於測試
-
通常意義的mock指的就是mock server, 模擬服務端返回的接口數據,用於前端開發,第三方接口聯調
為什么要mock?
1. 解決依賴問題:當我們測試一個接口或者功能模塊的時候,如果這個接口或者功能模塊依賴其他接口或其他模塊,那么如果所依賴的接口或功能模塊未開發完畢,那么我們就可以使用mock模擬被依賴接口,完成目標接口的測試。
2.單元測試:如果某個功能未開發完成,我們又要進行測試用例的代碼編寫,我們也可以先模擬這個功能進行測試
3.模擬復雜業務的接口:實際工作中如果我們在測試一個接口功能時,如果這個接口依賴一個非常復雜的接口業務,那么我們完全可以使用mock來模擬這個復雜的業務接口,其實 這個和解決接口依賴是一樣的原理。
4.前后端聯調:如果你是一個前端頁面開發,現在需要開發一個功能:根據后台返回的狀態展示不同的頁面,那么你就需要調用后台的接口,但是后台接口還未開發完成,可以借助mock來模擬后台這個接口返回你想要的數據。
如何mock?
1.利用抓包工具比如fiddler
2.可以利用web框架模擬,Django Flask ---python web開發框架,Flask的特點就是,結構簡單,容易入門
import random
import time
from flask import Flask,request,json
#實例化一個web服務對象
app=Flask(__name__)
#創建一個方法來處理請求
#定義一個路由--訪問服務的根目錄就可以得到結果
@app.route('/')
def hello():
return '<h1>hello flask</h1>'
#構造一個接受post請求的響應
@app.route('/post',methods=['POST'])
def test_post():
#處理接口發送過來的兩個參數,將兩個參數合並成一個字符串返回
d1=request.form['d1']
d2=request.form['d2']
return d1+d2
if __name__ == '__main__':
#運行服務,並確定服務運行的IP和端口
app.run('127.0.0.1','9090')
啟動mock服務端:
客戶端代碼:
import requests
body={
'd1':'hi',
'd2':'falsk12312312'
}
resp=requests.post('http://127.0.0.1:9090/post',data=body)
print(resp.text)
結果如下:

二:mock接口測試實戰案例
接口文檔如下:
極簡交易支付接口
接口路徑: /trade/purchase
請求方式: POST
請求參數:
| 參數 |
類型 |
是否必填 |
最大長度 |
描述 |
示例值 |
| out_trade_no |
String |
是 |
64 |
商戶訂單號,64個符以內、可包含字母、數字、下划線;需保證在商戶端不重復
|
20150320010101001 |
| auth_code |
String |
是 |
64 |
支付授權碼,25~30開頭的長度為16~24位的數字,實際字符串長度以開發者獲取的付款碼長度為准
|
28763443825664394 |
| subject |
String |
是 |
356 |
訂單標題 |
Iphone6 16G |
| buyer_id |
String |
否 |
28 |
買家的支付寶用id,如果為空,會從傳入的碼值信息中獲取買家 ID |
2088202954065786 |
| seller_id |
String |
否 |
28 |
如果該值為空,則默認為商戶簽約賬號對應的支付寶用戶ID
|
2088102146225135 |
| total_amount |
Price |
否 |
11 |
訂單總金額,單位為元,精確到小數點后兩位,取值范圍[0.01,100000000] 如果同時傳入【可打折金額】和【不可打折金 額】,該參數可以不用傳入;如果同時傳入了 【可打折金額】,【不可打折金額】,【訂單總金額】三者,則必須滿足如下條件:【訂單總金額】=【可打折金額】+【不可打折金額】
|
88.88 |
響應參數:

請求頭:鍵:Content-Type 值:application/json
請求示例:
{
'out_trade_no':'20150320010101001',
'auth_code':'28763443825664394',
'buyer_id':'2088202954065786',
'seller_id':'2088102146225135',
'subject':'Iphone6',
'total_amount':'88.88',
}
成功返回示例:
失敗返回示例:
{'error': {'password': '密碼錯誤'}, 'success': 'false'}
搭建mock服務端:
import random
import time
from flask import Flask,request,json
#實例化一個web服務對象
app=Flask(__name__)
#創建一個方法來處理請求
#定義一個路由--訪問服務的根目錄就可以得到結果
#構造一個接受post請求的響應
#處理極簡交易接口
@app.route('/trade/purchase',methods=['POST'])
def purchase():
#拿到客戶端返回的數據
res=json.loads(request.get_data())
out_trade_no=res['out_trade_no']
auth_code=res['auth_code']
data={
'code': '40004',
'msg': 'Business Failed',
'sub_code': 'ACQ.TRADE_HAS_SUCCESS',
'sub_msg': '交易已被支付',
'trade_no': '2013112011001004330000121536',
'out_trade_no': '6823789339978248'
}
#把out_trade_no改成客戶端發送過來的數據
data['out_trade_no']=out_trade_no
data['trade_no']=time.strftime('%Y%m%d%H%M%S')+str(random.random()).replace('0.','')
#驗證授權碼
if auth_code !='28763443825664394':
return {'coode':'50000','msg':'請求碼驗證失敗'}
return data
if __name__ == '__main__':
#運行服務,並確定服務運行的IP和端口
app.run('127.0.0.1','9090')
客戶端代碼:
#利用request發送post請求給服務端
import requests
data={
'out_trade_no':'20150320010101001',
'auth_code':'2876344382566439',
'buyer_id':'2088202954065786',
'seller_id':'2088102146225135',
'subject':'Iphone6',
'total_amount':'88.88',
}
resp=requests.post('http://127.0.0.1:9090/trade/purchase',json=data)
print(resp.json())
返回結果如下:

這樣就完成了mock接口測試了,小伙伴們學會了嗎?
