前言
今天跟小伙伴們一起來學習一下如何編寫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接口測試了,小伙伴們學會了嗎?