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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

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

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

1 接口測試

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

2 框架選型

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

3 環(huán)境搭建

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

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

  • jenkins:用于調(diào)度RF的用例執(zhí)行環(huán)境

  • gitlab:代碼倉庫

4 需求

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

  • 下單接口

  • 訂單結(jié)果查詢接口

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

環(huán)境覆蓋:需要支持能在多套環(huán)境運行,比如測試和預發(fā)布環(huán)境
系統(tǒng)集成:需要能夠集成在CICD中,實現(xiàn)版本更新后的自動檢測

4.2 用例設(shè)計
4.2.1 用例設(shè)計,根據(jù)業(yè)務(wù)場景設(shè)計測試用例,方便后續(xù)實現(xiàn)


4.2.2 測試數(shù)據(jù)構(gòu)造,預置不同環(huán)境的測試數(shù)據(jù),供實現(xiàn)調(diào)用

5 整體實現(xiàn)架構(gòu)

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

6 RF用例實現(xiàn)

6.1 引用的內(nèi)置關(guān)鍵字

  • RequestsLibrary 構(gòu)造http的請求,get|post等請求

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

6.2 自定義關(guān)鍵字

  • getEnvDomain 用于從自定義的configs.ini文件獲取對應環(huán)境的微服務(wù)的請求域名
    configs.ini的內(nèi)容

# 獲取configs.ini的內(nèi)容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中的內(nèi)容作為字典返回

import xlrd'''通用獲取excel數(shù)據(jù)@:param path excel文件路徑@:param sheet_name excel文件里面sheet的名稱 如:Sheet1@:env 環(huán)境,是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 提供接口下單的授權(quán)token

*** Keywords ***# 根據(jù)傳入的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 獲取該用例下的所有數(shù)據(jù)

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}
  • 實現(xiàn)demo

*** Settings ***Test TemplateResource 引用所有資源.txt*** Test Cases ****** Settings ***Test TemplateResource 引用所有資源.txt*** Test Cases ***01 下單卡密直儲商品[Tags] orderLOG ---------------------獲取下單前的數(shù)量、余額------------------------------------------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 ---------------------獲取下單后的數(shù)量、余額----------------------------------------------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的參數(shù)化構(gòu)建,定義it和pre兩套環(huán)境

jenkins發(fā)送RF執(zhí)行的命令

7.2 封裝的jenkins_job的執(zhí)行接口地址
通過python的flask框架,根據(jù)測試和pre兩套環(huán)境包一層jenkins的job執(zhí)行接口

__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設(shè)置為0.0.0.0,則外網(wǎng)用戶也可以訪問到這個服務(wù)app.run(host="0.0.0.0", port=80, debug=True)

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

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

7.4 將鏡像部署到kubernetes,對外提供服務(wù)
供觸發(fā)測試執(zhí)行的調(diào)用入口 ,這部分封裝的接口部署在本地的k8s集群下ordermiddle


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

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

7.6 發(fā)送測試報告

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。