日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

快速打造属于你的接口自动化测试框架

發布時間:2023/12/4 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 快速打造属于你的接口自动化测试框架 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1 接口測試

接口測試是對系統或組件之間的接口進行測試,主要是校驗數據的交換,傳遞和控制管理過程,以及相互邏輯依賴關系。
接口自動化相對于UI自動化來說,屬于更底層的測試,這樣帶來的好處就是測試收益更大,且維護成本相對來說較低,是我們進行自動化測試的首選

2 框架選型

目前接口自動化的框架比較多,比如jmeter,就可以集接口自動化和性能測試于一體,該工具編寫用例效率不高;還有我們常用的postman,結合newman也可以實現接口自動化;Python+unittest+requests+HTMLTestRunner?是目前比較主流的測試框架,對python有一定的編碼要求;
本期我們選擇robotframework(文中后續統一簡稱為RF)這一個比較老牌的測試框架進行介紹,RF是一個完全基于?關鍵字?測試驅動的框架,它即能夠基于它的一定規則,導入你需要的測試庫(例如:其集成了selenium的測試庫,即可以理解為操作控件的測試底層庫),然后基于這些測試庫,你能應用TXT形式編寫自己的關鍵字(支持python和java語言,這些關鍵字即你的庫組成),之后,再編寫(測試用例由測試關鍵字組成)進行測試;他支持移動端、UI自動化和接口自動化的測試

3 環境搭建

  • python的安裝:目前選取的python3以上的版本,RF的運行依賴python

  • robotframework:參考https://www.jianshu.com/p/9dcb4242b8f2

  • jenkins:用于調度RF的用例執行環境

  • gitlab:代碼倉庫

4 需求

4.1 需求內容
接口內容:實現一個下單,并檢查訂單狀態是否正常的場景;該需求涉及到如下三個接口

  • 下單接口

  • 訂單結果查詢接口

  • 下單必須帶上認證標識,生成token的接口

環境覆蓋:需要支持能在多套環境運行,比如測試和預發布環境
系統集成:需要能夠集成在CICD中,實現版本更新后的自動檢測

4.2 用例設計
4.2.1 用例設計,根據業務場景設計測試用例,方便后續實現


4.2.2 測試數據構造,預置不同環境的測試數據,供實現調用

5 整體實現架構

接口測試實現層:在RF,通過引用默認關鍵字?RequestsLibrary?(實現http請求)和通過python自定義關鍵字來完成用例實現的需求;
jenkins調度:在jenkins上配置一個job,設置好RF用例執行的服務器和發送給服務器相關的RF執行的指令,并且在jenkins中配置好測試報告模板,這樣用例便可以通過jenkins完成執行并發送測試結果給項目干系人;
生成用例執行的API:上圖中藍色部分,就是為了將jenkins的job生成一個可訪問api接口,方便被測項目的CICD集成;
集成到被測系統CICD流程:將上面步驟中封裝的API配置在被測應用的gitlab-ci.yml中,完成整個接口自動化的閉環

6 RF用例實現

6.1 引用的內置關鍵字

  • RequestsLibrary 構造http的請求,get|post等請求

getRequests# get請求的入參[Arguments] ${url_domain} ${getbody} ${geturl} ${getToken}Create session postmain ${url_domain}# 定義header的內容${head} createdictionary content-type=application/json Authorization=${getToken} MerchantId=${s_merchant_id}# get請求${addr} getRequest postmain ${geturl} params=${getbody} headers=${head}# 請求狀態碼斷言Should Be Equal As Strings ${addr.status_code} 200${response_get_data} To Json ${addr.content}# 返回http_get請求結果Set Test Variable ${response_get_data} Delete All Sessions

6.2 自定義關鍵字

  • getEnvDomain 用于從自定義的configs.ini文件獲取對應環境的微服務的請求域名
    configs.ini的內容

# 獲取configs.ini的內容import configparserdef getEnv(path,env):config = configparser.ConfigParser()config.read(path)passport = config[env]['passport']stock=config[env]['stock']finance=config[env]['finance']SUP = config[env]['SUP']publicApi = config[env]['publicApi']publicOrder = config[env]['publicOrder']data_dict={'passport':passport,'stock':stock,'finance':finance,'SUP':SUP,'publicApi':publicApi,'publicOrder':publicOrder}return data_dict
  • excelTodict 用戶將excel中的內容作為字典返回

import xlrd'''通用獲取excel數據@:param path excel文件路徑@:param sheet_name excel文件里面sheet的名稱 如:Sheet1@:env 環境,是IT還是PRE'''def getExcelDate(path, sheet_name,env):bk = xlrd.open_workbook(path)sh = bk.sheet_by_name(sheet_name)row_num = sh.nrowsdata_list = []for i in range(1, row_num):row_data = sh.row_values(i)data = {}for index, key in enumerate(sh.row_values(0)):data[key] = row_data[index]data_list.append(data)data_list1 = []for x in data_list:#print('這是'+str(x))if(x.get('env')==env):data_list1.append(x)return data_list1
  • getToken 提供接口下單的授權token

*** Keywords ***# 根據傳入的clientid、secret生成對應的tokengetToken[Arguments] ${client_id} ${client_secret} ${url_domain}Create session postmain ${url_domain}${auth} createdictionary grant_type=client_credentials client_id=${client_id} client_secret=${client_secret}${header} createdictionary content-type=application/x-www-form-urlencoded${addr} postRequest postmain /oauth/token data=${auth} headers=${header}Should Be Equal As Strings ${addr.status_code} 200${responsedata} To Json ${addr.content}${access} Get From Dictionary ${responsedata} access_token${token} set variable bearer ${access}Set Test Variable ${token}Delete All Sessions
  • getAllDate 獲取該用例下的所有數據

getAllData[Arguments] ${row_no}getEnvDomaingetBalance ${row_no}getStockNum ${row_no}getSupProPrice ${row_no}getProPrice ${row_no}Set Test Variable ${publicOrderUrl}Set Test Variable ${FPbalance}Set Test Variable ${Pbalance}Set Test Variable ${Sbalance}Set Test Variable ${Jbalance}Set Test Variable ${Cardnum}Set Test Variable ${sprice}Set Test Variable ${price}Set Test Variable ${j_merchant_id}Set Test Variable ${s_merchant_id}Set Test Variable ${stock_id}Set Test Variable ${p_product_id}Set Test Variable ${s_product_id}
  • 實現demo

*** Settings ***Test TemplateResource 引用所有資源.txt*** Test Cases ****** Settings ***Test TemplateResource 引用所有資源.txt*** Test Cases ***01 下單卡密直儲商品[Tags] orderLOG ---------------------獲取下單前的數量、余額------------------------------------------getAllData 0${Cardnum1} set variable ${Cardnum}${FPbalance1} set variable ${FPbalance}${Pbalance1} set variable ${Pbalance}${Sbalance1} set variable ${Sbalance}${Jbalance1} set variable ${Jbalance}${CustomerOrderNo1} Evaluate random.randint(1000000, 9999999) random${Time} Get Timelog ------------------------下單操作-------------------------------------------------------getToken 100xxxx 295dab07a9xxxx9780be0eb95xxxx ${casUrl}${input_cs} create dictionary memberId=${j_merchant_id} clientId=1xxx079 userId=string shopType=string customerOrderNo=${CustomerOrderNo1}... productId=${p_product_id} buyNum=1 chargeAccount=otest888888 notifyUrl=string chargeIp=string chargePassword=string... chargeGameName=string chargeGameRole=string chargeGameRegion=string chargeGameSrv=string chargeType=string remainingNumber=0... contactTel=string contactQQ=string customerPrice=0 poundage=0 batchNumber= originalOrderId=string... shopName=string appointSupProductId=0 stemFromSubOrderId=123456 externalBizId=456789postRequests ${publicOrderUrl} ${input_cs} /api/Order ${token}${data} get from dictionary ${responsedata} data${orderid} get from dictionary ${data} idsleep 6${getdata} create dictionary Id=${orderid} PageIndex=1 PageSize=1getRequests ${publicOrderUrl} ${getdata} /api/Order/GetList ${token}${datalist} get from dictionary ${response_get_data} data${data} get from dictionary ${datalist} list${dict} set variable ${data}[0]${orderOuterStatus} get from dictionary ${dict} orderOuterStatusLOG ---------------------獲取下單后的數量、余額----------------------------------------------getAllData 0${Cardnum2} set variable ${Cardnum}${FPbalance2} set variable ${FPbalance}${Pbalance2} set variable ${Pbalance}${Sbalance2} set variable ${Sbalance}${Jbalance2} set variable ${Jbalance}${sprice} set variable ${sprice}${price} set variable ${price}log ------------------斷言-----------------------------------------------------------------${Cardnum3} Evaluate ${Cardnum1}${Jbalance3} Evaluate ${Jbalance1}${Sbalance3} Evaluate ${Sbalance1}${Pbalance3} Evaluate ${Pbalance1}should be true ${orderOuterStatus}==90should be true ${Cardnum3}==${Cardnum2}should be true ${Jbalance3}==${Jbalance2}should be true ${Sbalance3}==${Sbalance2}should be true ${Pbalance3}==${Pbalance2}

7 集成到CICD流程

7.1 jenkins配置job
通過jenkins的參數化構建,定義it和pre兩套環境

jenkins發送RF執行的命令

7.2 封裝的jenkins_job的執行接口地址
通過python的flask框架,根據測試和pre兩套環境包一層jenkins的job執行接口

__author__ = 'paul'# !/usr/bin/env python# -*- coding: utf-8 -*-from flask import Flask, abort, request, jsonifyimport jenkinsserver = jenkins.Jenkins('http://10.0.1.xxx:80', username='xxx', password='fuluxxxx')app = Flask(__name__)tasks = []# it的測試集合http請求接口@app.route('/test/it', methods=['get'])def robot_Test_It():server.build_job('CI_FuluOrder', {'environment': 'IT'})return jsonify({'result': 'success'})# pre的測試集合http請求接口@app.route('/test/pre', methods=['get'])def robot_Test_Pre():server.build_job('CI_FuluOrder', {'environment': 'PRE'})return jsonify({'result': 'success'})if __name__ == "__main__":# 將host設置為0.0.0.0,則外網用戶也可以訪問到這個服務app.run(host="0.0.0.0", port=80, debug=True)

7.3 將上述flask封裝的接口打包成鏡像
根據dockerfile生成鏡像

FROM python:3.6WORKDIR /appEXPOSE 80COPY . .RUN pip install -r requirements.txtENTRYPOINT ["python","robotTestApi.py"]

7.4 將鏡像部署到kubernetes,對外提供服務
供觸發測試執行的調用入口 ,這部分封裝的接口部署在本地的k8s集群下ordermiddle


IT:?http://ordermiddle.xxx.cn/test/it
pre:http://ordermiddle.xxx.cn/test/pre

7.5 被測項目的CICD集成接口自動化測試
gitlab目前采取直接對CICD腳本加入測試步驟,在部署到容器30秒后(考慮到容器在K8S啟動時間)調用測試接口

7.6 發送測試報告

總結

以上是生活随笔為你收集整理的快速打造属于你的接口自动化测试框架的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。