厦门哪里有建设网站的,网页模板的制作步骤,网站开发维护干嘛,友情链接交换的意义是什么1 接口测试
接口测试是对系统或组件之间的接口进行测试#xff0c;主要是校验数据的交换#xff0c;传递和控制管理过程#xff0c;以及相互逻辑依赖关系。 接口自动化相对于UI自动化来说#xff0c;属于更底层的测试#xff0c;这样带来的好处就是测试收益更大#xff…1 接口测试
接口测试是对系统或组件之间的接口进行测试主要是校验数据的交换传递和控制管理过程以及相互逻辑依赖关系。 接口自动化相对于UI自动化来说属于更底层的测试这样带来的好处就是测试收益更大且维护成本相对来说较低是我们进行自动化测试的首选
2 框架选型
目前接口自动化的框架比较多比如jmeter就可以集接口自动化和性能测试于一体该工具编写用例效率不高还有我们常用的postman结合newman也可以实现接口自动化PythonunittestrequestsHTMLTestRunner 是目前比较主流的测试框架对python有一定的编码要求 本期我们选择robotframework文中后续统一简称为RF这一个比较老牌的测试框架进行介绍RF是一个完全基于 关键字 测试驱动的框架它即能够基于它的一定规则导入你需要的测试库例如其集成了selenium的测试库即可以理解为操作控件的测试底层库然后基于这些测试库你能应用TXT形式编写自己的关键字支持python和java语言这些关键字即你的库组成之后再编写测试用例由测试关键字组成进行测试他支持移动端、UI自动化和接口自动化的测试
3 环境搭建
python的安装目前选取的python3以上的版本RF的运行依赖pythonrobotframework参考https://www.jianshu.com/p/9dcb4242b8f2jenkins用于调度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-typeapplication/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 Sessions6.2 自定义关键字
getEnvDomain 用于从自定义的configs.ini文件获取对应环境的微服务的请求域名 configs.ini的内容
# 获取configs.ini的内容
import configparser
def getEnv(path,env):config configparser.ConfigParser()config.read(path)passport config[env][passport]stockconfig[env][stock]financeconfig[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_dictexcelTodict 用户将excel中的内容作为字典返回
import xlrd
通用获取excel数据
:param path excel文件路径
:param sheet_name excel文件里面sheet的名称 如Sheet1
:env 环境是IT还是PREdef 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_list1getToken 提供接口下单的授权token
*** Keywords ***
# 根据传入的clientid、secret生成对应的token
getToken[Arguments] ${client_id} ${client_secret} ${url_domain}Create session postmain ${url_domain}${auth} createdictionary grant_typeclient_credentials client_id${client_id} client_secret${client_secret}${header} createdictionary content-typeapplication/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 SessionsgetAllDate 获取该用例下的所有数据
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 Template
Resource 引用所有资源.txt*** Test Cases ***
*** Settings ***
Test Template
Resource 引用所有资源.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} clientId1xxx079 userIdstring shopTypestring customerOrderNo${CustomerOrderNo1}... productId${p_product_id} buyNum1 chargeAccountotest888888 notifyUrlstring chargeIpstring chargePasswordstring... chargeGameNamestring chargeGameRolestring chargeGameRegionstring chargeGameSrvstring chargeTypestring remainingNumber0... contactTelstring contactQQstring customerPrice0 poundage0 batchNumber originalOrderIdstring... shopNamestring appointSupProductId0 stemFromSubOrderId123456 externalBizId456789postRequests ${publicOrderUrl} ${input_cs} /api/Order ${token}${data} get from dictionary ${responsedata} data${orderid} get from dictionary ${data} idsleep 6${getdata} create dictionary Id${orderid} PageIndex1 PageSize1getRequests ${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, jsonify
import jenkinsserver jenkins.Jenkins(http://10.0.1.xxx:80, usernamexxx, passwordfuluxxxx)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(host0.0.0.0, port80, debugTrue)
7.3 将上述flask封装的接口打包成镜像 根据dockerfile生成镜像
FROM python:3.6
WORKDIR /app
EXPOSE 80
COPY . .
RUN pip install -r requirements.txt
ENTRYPOINT [python,robotTestApi.py]
7.4 将镜像部署到kubernetes对外提供服务 供触发测试执行的调用入口 ,这部分封装的接口部署在本地的k8s集群下ordermiddle
IT: http://ordermiddle.xxx.cn/test/it prehttp://ordermiddle.xxx.cn/test/pre
7.5 被测项目的CICD集成接口自动化测试 gitlab目前采取直接对CICD脚本加入测试步骤在部署到容器30秒后考虑到容器在K8S启动时间调用测试接口 7.6 发送测试报告 Python接口自动化测试零基础入门到精通2023最新版