python+pytest接口自动化参数关联

 更新时间:2022-06-24 05:22:30   作者:佚名   我要评论(0)

目录前言一、什么是参数关联?二、有哪些场景?三、参数关联场景四、脚本编写1、在用例中按顺序调用2、 使用Fixture函数五、 总结前言
今天呢

前言

今天呢,笔者想和大家来聊聊python+pytest接口自动化测试的参数关联,笔者这边就不多说废话了,咱们直接进入正题。

一、什么是参数关联?

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

二、有哪些场景?

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

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

三、参数关联场景

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

  • 用户在购物车选择商品点击【去结算】进入订单确认页,订单确认页点击【提交订单】这时会先请求下单接口创建订单
  • 紧接着会拿创建的订单去请求获取支付凭证接口,这个接口会调起支付页面,也就是输入密码的支付界面
  • 输入支付密码后会请求支付服务的支付接口进行实际支付,支付的结果会返回给请求方,告知是否支付成功

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

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

 下单接口如下:

  • 接口地址:<服务器>/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=\"https://openapi.alipay.com/gateway.do?charset=UTF-8&method=alipay.trade.wap.pay&sign=aTKlfEnYgR7x9xs1Eyjipo0S%2BFtQ6AKu9d%2Brb7iieMThz2Dq7zp4h8QH4lelTKovOloT%2FPiNXR5miwKgOWW3K6pl0TFO5XX5NSZNBmU%2BPd5ogeo0YT0vCqWUM60rqbYLNtZmvyx%2BAR4Z2SOnqs0CYqVIbZAhpn1Bd5HsdcCCYVgsgOdbEE60Cfu3LG3Z%2FQ0GQIdW24uTyr%2BojRc25ipOC9NIYwtba8UjRw18Z3e7sj75qoIg%2FipICH7FCJBJEdlgBGlNxIjKzhYj4OBg93D&return_url=https%3A%2F%2Fblog.csdn.net%2Fa032788aotify_url=http%3A%2F%2F82.157.145.132%3A8089%2Ftest%2Fnotify%2Fgateway&version=1.0&app_id=2021001105644746&sign_type=RSA2&timestamp=2021-150&alipay_sdk=alipay-sdk-java-4.9.5.ALL&format=json\">\n<input type=\"hidden\" name=\"biz_content\" value=\"{&quot;time_expire&quot;:&quot;2022-12-31 22:00:00&quot;,&quot;out_trade_no&quot;:&quot;123213213219379213&quot;,&quot;total_amount&quot;:0.01,&quot;subject&quot;:&quot;测试商品&quot;,&quot;product_code&quot;:&quot;QUICK_WAP_WAY&quot;}\">\n<input type=\"submit\" value=\"立即支付\" style=\"display:none\" >\n</form>\n<script>document.forms[0].submit();</script>"
    },
    "t": 1639659171031
}

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

四、脚本编写

那么在pytest框架的自动化测试中,参数关联可以怎样处理呢?这里提供两种思路,如下:

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

1、在用例中按顺序调用

代码示例如下:

import requests
import json
import pytest
?
def 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).text
? ? tradeNo = 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).text
? ? res_pay = json.loads(res_pay)
? ? # 断言
? ? assert res_pay["code"]==0
? ? assert res_pay["data"]["payNo"]
? ? assert res_pay["data"]["certificate"]
? ??
? ??
if __name__ == '__main__':
? ? pytest.main()

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

2、 使用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).text
? ? tradeNo = 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).text
? ? res_pay = json.loads(res_pay)
? ? # 断言
? ? assert res_pay["code"] == 0
? ? assert res_pay["data"]["payNo"]
? ? assert res_pay["data"]["certificate"]

五、 总结

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

对于刚入门的同学而言,我们需要明白的是,什么是参数关联,以及可以怎样去处理它

到此这篇关于python+pytest接口自动化参数关联的文章就介绍到这了,更多相关python 参数关联内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
  • python接口自动化(十六)--参数关联接口后传(详解)
  • Python测试框架pytest高阶用法全面详解
  • python+pytest接口自动化之token关联登录的实现
  • Python测试框架pytest介绍
  • Appium+Python+pytest自动化测试框架的实战
  • Python自动化测试框架pytest的详解安装与运行
  • Python Pytest装饰器@pytest.mark.parametrize详解

相关文章

  • python+pytest接口自动化参数关联

    python+pytest接口自动化参数关联

    目录前言一、什么是参数关联?二、有哪些场景?三、参数关联场景四、脚本编写1、在用例中按顺序调用2、 使用Fixture函数五、 总结前言 今天呢
    2022-06-24
  • JVM常见垃圾收集器学习指南

    JVM常见垃圾收集器学习指南

    前言 垃圾收集器 是 垃圾收集算法 的具体实现本文将对市面上常见的垃圾收集器类型进行讲解,希望你们会喜欢 垃圾收集器类型 垃圾收集器 是 垃
    2022-06-24
  • hive数据仓库新增字段方法

    hive数据仓库新增字段方法

    目录新增字段1、方法1cascade知识2、方法2 (适用于外部表)3、方法3(下下策)修改字段删除列新增字段 1、方法1 alter table 表名 add colu
    2022-06-23
  • Qt简单实现密码器控件

    Qt简单实现密码器控件

    本文实例为大家分享了Qt自定义一个密码器控件的简单实现代码,供大家参考,具体内容如下 实现构思: 密码器的功能可以看成是计算器和登陆界面
    2022-06-15
  • 微信小程序使用ECharts的示例详解

    微信小程序使用ECharts的示例详解

    目录安装 ECharts 组件使用 ECharts 组件图表延迟加载echarts-for-weixin 是 ECharts 官方维护的一个开源项目,提供了一个微信小程序组件(C
    2022-06-15
  • 5个实用的JavaScript新特性

    5个实用的JavaScript新特性

    目录前言1.# 使用"Object.hasOwn"替代“in”操作符2.# 使用"#"声明私有属性3.# 超有用的"数字分隔符"4.# 使用"?."简化"&&"和三元运
    2022-06-15
  • 解决@Scope(“prototype“)不生效的问题

    解决@Scope(“prototype“)不生效的问题

    目录@Scope(“prototype“)不生效@Scope(“prototype“)正确用法——解决Bean多例问题1.问题,Spring管理的某
    2022-06-15
  • QT实现用户登录注册功能

    QT实现用户登录注册功能

    本文实例为大家分享了QT实现用户登录注册的具体代码,供大家参考,具体内容如下 1、login.h #ifndef LOGIN_H #define LOGIN_H #include <QW
    2022-06-15
  • C#使用LINQ查询操作符实例代码(二)

    C#使用LINQ查询操作符实例代码(二)

    目录六、连表操作符1、内连接2、左外连接(DefaultIfEmpty)3、组连接七、集合操作八、分区操作符1、Take():2、TakeWhile():3、Skip():4、S
    2022-06-15
  • Golang泛型与反射的应用详解

    Golang泛型与反射的应用详解

    目录1. 泛型1.1 定义1.2 例子1.3 自定义泛型类型1.4 泛型与switch结合使用1.5 泛型实战2. 反射2.1 定义2.2 方法2.3 反射读取2.4 反射操作2.5
    2022-06-15

最新评论