Python-Mock接口測試


前言

今天跟小伙伴們一起來學習一下如何編寫Python腳本進行mock測試。

什么是mock?

  • 測試樁,模擬被測對象的返回,用於測試

  • 通常意義的mock指的就是mock server, 模擬服務端返回的接口數據,用於前端開發,第三方接口聯調

為什么要mock?

1. 解決依賴問題:當我們測試一個接口或者功能模塊的時候,如果這個接口或者功能模塊依賴其他接口或其他模塊,那么如果所依賴的接口或功能模塊未開發完畢,那么我們就可以使用mock模擬被依賴接口,完成目標接口的測試。

2.單元測試:如果某個功能未開發完成,我們又要進行測試用例的代碼編寫,我們也可以先模擬這個功能進行測試  

3.模擬復雜業務的接口:實際工作中如果我們在測試一個接口功能時,如果這個接口依賴一個非常復雜的接口業務,那么我們完全可以使用mock來模擬這個復雜的業務接口,其實  這個和解決接口依賴是一樣的原理。 

4.前后端聯調:如果你是一個前端頁面開發,現在需要開發一個功能:根據后台返回的狀態展示不同的頁面,那么你就需要調用后台的接口,但是后台接口還未開發完成,可以借助mock來模擬后台這個接口返回你想要的數據。

如何mock?

1.利用抓包工具比如fiddler

2.可以利用web框架模擬,Django Flask ---python web開發框架,Flask的特點就是,結構簡單,容易入門

一:利用flask編寫一個最簡單的接口
安裝Flask, 在dos窗口輸入:pip install flask
搭建mock服務端代碼:
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',

成功返回示例: 

{
   'code':'40004',
  'msg':'Business Failed',
  'sub_code':'ACQ.TRADE_HAS_SUCCESS',
  'sub_msg':'交易已被支付',
  'trade_no':'2013112011001004330000121536',
  'out_trade_no':'6823789339978248'
}

失敗返回示例:

{'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接口測試了,小伙伴們學會了嗎?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM