当前位置: 首页 > news >正文

Python接口自动化测试-关联参数

前言

什么是参数关联?

参数关联,也叫接口关联,即接口之间存在参数的联系或依赖。在完成某一功能业务时,有时需要按顺序请求多个接口,此时在某些接口之间可能会存在关联关系。比如:B接口的某个或某些请求参数是通过调用A接口获取的,即需要先请求A接口,从A接口的返回数据中拿到需要的字段值,在请求B接口时作为请求参数传入。

有哪些场景?

最常见的场景之一:
请求登录接口后获取到token值,后续其他接口请求时需要将token作为请求参数传入。

再比如下单–>支付场景,调用下单接口生成订单后会返回订单号,订单号传给支付接口进行支付。

1、参数关联场景

以网上购物为例,对应的场景及请求我们可以大致简化如下(可联想某宝购物流程):

用户在购物车选择商品点击【去结算】进入订单确认页,订单确认页点击【提交订单】这时会先请求下单接口创建订单

紧接着会拿创建的订单去请求获取支付凭证接口,这个接口会调起支付页面,也就是输入密码的支付界面

输入支付密码后会请求支付服务的支付接口进行实际支付,支付的结果会返回给请求方,告知是否支付成功

这个流程中涉及到的接口其实都是有关联的,我们要对整个流程进行测试那么就需要按顺序调用所有这些涉及到的接口。

但这里我们只需要弄明白参数关联,那么以下单接口和获取支付凭证接口为例,举例说明就够了,即先请求下单接口生成订单号,再拿这个订单号去请求获取支付凭证接口,才能调起支付界面并进行支付。

下单接口如下:
接口地址:<服务器>/trade/order/purchase
请求类型:post
请求参数:


{"goodsId": 10, //商品id"goodsSkuId": 33, //sku id"num": 2, //购买数量"tradePromotion": { //选择的优惠项"type": 1, //类型<1:优惠券>"promotionId": 1 //优惠id}}

返回值 data:


{"code": 0,"msg": "成功","data": {"tradeNo": "0020220116204344962706666" //交易订单号},"t": 1639658625474}

获取支付凭证接口如下:
接口地址:<服务器>/pay/pre/consum
请求类型:post
请求参数:


{"orderNo":"0020220116204344962706666", //交易订单号"product":"alipayWapClient" //支付渠道<alipayWapClient:支付宝手机网页支付>}

返回值 data:


{"code": 0,"msg": "成功","data": {"payNo":"123213213219379213","certificate": "<form name=\"punchout_form\" method=\"post\" action=\"xxxxxxxxxxxxxxxxx\">\n<input type=\"submit\" value=\"立即支付\" style=\"display:none\" >\n</form>\n<script>document.forms[0].submit();</script>"},"t": 1639659171031}

其中orderNo字段使这两个接口关联了起来。因为每次生成的订单号都不一样,所以在测试这个场景的时候,就需要使这两个接口的参数进行关联,才能走通。

2、脚本编写

那么在pytest框架的自动化测试中,参数关联可以怎样处理呢?

两种思路如下:
根据业务场景的调用时序,在用例中按顺序调用接口
将依赖的接口编写成fixture函数,并使用yield返回下个接口需要的参数

1)在用例中按顺序调用
代码示例如下:


import requestsimport jsonimport pytestdef test_order_pay():'''创建订单->获取支付凭证,调起支付界面:return:'''# 先调用下单接口生成订单url_order = "https://gouwu.com/trade/order/purchase"data_order = {"goodsId": 10,"goodsSkuId": 33,"num": 2,"tradePromotion": {"type": 1,"promotionId": 1},"tradeDirectionArticle": {"articleId": 1}}res_order = requests.post(url=url_order, json=data_order).texttradeNo = json.loads(res_order)["tradeNo"]# 再请求获取支付凭证接口url_pay = "https://gouwu.com/pay/pre/consum"data_pay = {"orderNo": tradeNo, # tradeNo通过下单接口获取"product": "alipayWapClient"}res_pay = requests.post(url=url_pay, json=data_pay).textres_pay = json.loads(res_pay)# 断言assert res_pay["code"]==0assert res_pay["data"]["payNo"]assert res_pay["data"]["certificate"]if __name__ == '__main__':pytest.main()

上面的代码只是流水式的进行调用,我们还可以先将每个接口请求封装成单独的函数,在测试用例中只需按照顺序调用这些函数即可,这个我们会在后续的文章中进行说明。

2)使用Fixture函数
pytest中Fixture函数可以参考我之前的文章pytest-Fixture(固件)

定义Fixture函数,代码示例如下:


@pytest.fixture()def get_order():'''请求下单接口,创建订单:return:'''url_order = "https://gouwu.com/trade/order/purchase"data_order = {"goodsId": 10,"goodsSkuId": 33,"num": 2,"tradePromotion": {"type": 1,"promotionId": 1},"tradeDirectionArticle": {"articleId": 1}}res_order = requests.post(url=url_order, json=data_order).texttradeNo = json.loads(res_order)["tradeNo"]yield tradeNo

在测试函数中调用上面定义的fixture函数,代码示例如下:


def test_pay(get_order):'''下单->支付场景校验:param get_order: 调用上面的Fixture函数,函数名get_order即返回的tradeNo:return:'''url_pay = "https://gouwu.com/pay/pre/consum"data_pay = {"orderNo": get_order, # get_order即为上面定义的fixture函数返回值"product": "alipayWapClient"}res_pay = requests.post(url=url_pay, json=data_pay).textres_pay = json.loads(res_pay)# 断言assert res_pay["code"] == 0assert res_pay["data"]["payNo"]assert res_pay["data"]["certificate"]

参数关联在接口自动化测试中是必然会遇到的场景,设计关联参数的用例会直接影响到用例的维护,当然这也是在接口自动化项目的架构设计时就需要考虑的问题。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • GIT版本管理与分支控制
  • SD-WAN组网技术的九大应用场景
  • WPF学习(1)-Grid控件(网格布局)
  • 一体化水位站的综合优势
  • podman学习笔记
  • JavaScript 实例:掌握编程技巧
  • cd-detect-level
  • rosbag中的图像话题转为图片
  • 大语言模型(LLM)构建产品的一年经验总结【干货长文】
  • vue3修改带小数点的价格数字:小数点的前后数字,要分别显示成不同颜色和大小!已经封装成组件了!
  • 基于 Java Supplier与Predicate 封装自动重试机制通用接口
  • 指针函数和函数指针
  • 企业级OV通配符/泛域名https证书申请
  • 大模型检索X一键成片,巴黎奥运的AI新演绎
  • 敏捷与DevOps有什么不同?
  • SegmentFault for Android 3.0 发布
  • @jsonView过滤属性
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 「面试题」如何实现一个圣杯布局?
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • C++入门教程(10):for 语句
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • JS 面试题总结
  • node入门
  • PHP CLI应用的调试原理
  • 飞驰在Mesos的涡轮引擎上
  • 分布式熔断降级平台aegis
  • 将回调地狱按在地上摩擦的Promise
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 前端设计模式
  • 深度学习入门:10门免费线上课程推荐
  • 小程序button引导用户授权
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #QT(智能家居界面-界面切换)
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (02)Hive SQL编译成MapReduce任务的过程
  • (11)MATLAB PCA+SVM 人脸识别
  • (13)Hive调优——动态分区导致的小文件问题
  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • (day18) leetcode 204.计数质数
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (八)Spring源码解析:Spring MVC
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking