Python+pytest接口自动化之参数关联

2023-09-22 14:46:46

一、什么是参数关联?

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

二、有哪些场景?

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

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

三、参数关联场景

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

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

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

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

下单接口如下:

  • 接口地址:<服务器>/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"]

五、 总结

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

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

最后:下面是配套学习资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!【100%无套路免费领取】

软件测试面试小程序

被百万人刷爆的软件测试题库!!!谁用谁知道!!!全网最全面试刷题小程序,手机就可以刷题,地铁上公交上,卷起来!

涵盖以下这些面试题板块:

1、软件测试基础理论 ,2、web,app,接口功能测试 ,3、网络 ,4、数据库 ,5、linux

6、web,app,接口自动化 ,7、性能测试 ,8、编程基础,9、hr面试题 ,10、开放性测试题,11、安全测试,12、计算机基础

  全套资料获取方式:点击下方小卡片自行领取即可

更多推荐

SpringCloud Gateway搭建Gateway 微服务应用实例

😀前言本篇博文是关于SpringCloudGateway搭建Gateway微服务应用实例,希望你能够喜欢🏠个人主页:晨犀主页🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰如果文章有什么需要改进

Linux系统命令——通过端口确认进程及路径方法

一、端口概念在网络技术中,端口(port)大致有两种意思:一是物理意义上的端口比如,ADSLModem、集线器、交换机、路由器用于连接其他网络设备的接口,如RJ-45端口、SC端口等等。二是逻辑意义上的端口,一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的

软件测试缺陷报告详解

【软件测试行业现状】2023年了你还敢学软件测试?未来已寄..测试人该何去何从?【自动化测试、测试开发、性能测试】缺陷报告是描述软件缺陷现象和重现步骤地集合。软件缺陷报告SoftwareBugReport(SBR)或软件问题报告SoftwareProblemReport(SPR)作用:缺陷报告是软件测试人员的工作成果之

若依使用及源码解析(前后端分离版)

部署环境JDK>=1.8MYSQL>=5.7Maven>=3.0Node>=12Redis>=3运行若依项目下载若依源码若依官网若依项目源码(前后端分离)运行后端项目ruoyi-ui就是vue项目(这里使用vscode打开)整体用idea打开1.配置数据库(sql提供sql文件中的sql脚本配置)创建数据库ruoyi_

Web安全与攻防

Web安全概述在Internet大众化及Web技术飞速演变的今天,在线安全所面临的挑战日益严峻。伴随着在线信息和服务的可用性的提升,以及基于Web的攻击和破坏的增长,安全风险达到了前所未有的高度。Web安全可以从以下三个方面进行考虑:Web服务器的安全、Web客户端的安全、Web通信信道的安全。针对Web服务器的攻击可

从HTTP到HTTPS:网站安全通信的演进之路

HTTP协议与TCP/IP协议族内的其他协议相同部分,用于客户端和服务器端的通信。下面来看一下HTTP具体是怎么工作的。1、HTTP前生今世在HHTP/0.9版本,主要是通过确立了客户端请求、服务器端响应的通信流程来解决HTML文件传输,只能获取文本资源。HTTP/1.0是一个简单的文本协议,通过设立头部字段来解决不同

5.2 磁盘CRC32完整性检测

CRC校验技术是用于检测数据传输或存储过程中是否出现了错误的一种方法,校验算法可以通过计算应用与数据的循环冗余校验(CRC)检验值来检测任何数据损坏。通过运用本校验技术我们可以实现对特定内存区域以及磁盘文件进行完整性检测,并以此来判定特定程序内存是否发生了变化,如果发生变化则拒绝执行,通过此种方法来保护内存或磁盘文件不

二十一、MySQL(多表)内连接、外连接、自连接实现

1、多表查询(1)基础概念:(2)多表查询的分类:2、内连接(1)基础概念:(2)隐式内连接:基础语法:select表1.name,表2.namefrom表1,表2where表1.外键=表2.被链接的字段;实际操作:#(1)查询每一个员工的姓名,以及关联的部门名称--隐式查询selectemp.name,course.

gulp 错误集锦

为了打包构建之前的layui写的项目,用到了gulp,但是遇到的坑还挺多,记录一下。1、运行gulp时报错ReferenceError:primordialsisnotdefined解决办法:ReferenceError:primordialsisnotdefined意思是primordials这个没被定义,是因为项目

Centos配置链路聚合bond的步骤

Centos配置链路聚合的步骤如下:查看网卡名称和状态Shell#nmclidevicestatus创建bond0网卡Shell#vi/etc/sysconfig/network-scripts/ifcfg-bond0DEVICE=bond0ONBOOT=yesBOOTPROTO=noneNM_CONTROLLED=n

prometheus+node+process-exporter+grafans

安装Prometheus要在Ubuntu18.04上安装Prometheus,您可以按照以下步骤进行:sudoapt-getupdate安装依赖:sudoapt-getinstallwgettar下载最新的Prometheus版本:wgethttps://github.com/prometheus/prometheus

热文推荐