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

news2024/11/26 23:35:08

目录

一. 参数关联场景

二. 脚本编写

1. 在用例中按顺序调用

2. 使用Fixture函数

三. 总结


什么是参数关联?

参数关联,也叫接口关联,即接口之间存在参数的联系或依赖。在完成某一功能业务时,有时需要按顺序请求多个接口,此时在某些接口之间可能会存在关联关系。比如: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函数

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).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"]

三. 总结

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

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/760000.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

听GPT 讲K8s源代码--pkg(三)

在 Kubernetes 项目中&#xff0c;pkg/controller目录下的子目录通常包含控制器相关的代码和逻辑。控制器是 Kubernetes 中用于管理资源的核心组件之一。它们负责监控资源的状态&#xff0c;并确保其符合所定义的期望状态。下面是对这些子目录的一些常见作用的解释&#xff1a;…

JavaScript中数据类型

对象和原始值 ● 在JavaScript中&#xff0c;有两种主要类型的数据&#xff0c;要不是原始值&#xff0c;要不是对象&#xff1b; 7种原始数据类型 1.数字 浮点数用于小数和整数。let age 23; 2.字符串 一系列字符的序列&#xff0c;用于文本。let firstName “IT知识…

全网最全整理,Allure集成Jenkins自动化测试实战(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Allure插件安装 …

libbpf-bootstrap 开发指南:概念与如何安装

目录 概念 如何安装& 使用 git 地址 使用git clone 下载代码 安装依赖环境 安装libbpf 编译example 概念 libbpf-bootstrap 是一个项目&#xff0c;旨在帮助开发者快速启动和开发使用 eBPF (Extended Berkeley Packet Filter) 和 libbpf 的程序。eBPF 是一种可以在…

2023.07.16 学习周报

文章目录 摘要文献阅读1.题目2.问题3.介绍4.Problem definition5.Method5.1 Feature Extractor5.2 Synthetic Node Generation5.3 Edge Generator5.4 GNN Classifier5.5 Optimization Objective5.6 算法 6.实验6.1 数据集6.2 基线6.3 实验结果 7.结论 数学建模1.欧式距离2.切比…

0130 物理层1

目录 2.物理层 2.1通信基础 2.1部分习题 2.物理层 2.1通信基础 2.1部分习题 1.下列说法正确的是&#xff08;&#xff09; A.信道与通信电路类似&#xff0c;一条可通信电路往往包含一个信道 B.调制是把模拟数据转换为数字信号的过程 C.信息传输速率是通信信道上每秒传…

SIP支持的传输协议

一、SIP支持的传输协议-UDP、TCP、TLS SIP是一个应用层的会话协议&#xff0c;与一般协议不同的是&#xff0c;SIP协议可以同时支持各种传输协议。 SIP支持UDP传输&#xff1a;UDP是一个无连接的协议&#xff0c;且不提供可靠性。在UDP上建立SIP连接存在不可靠性。 SIP…

【K210模块】使用UART模块发送和接收数据

官方案例链接 【K210模块】使用UART模块发送和接收数据 官方案例链接 一、代码部分1、添加转换句&#xff08;1&#xff09;字节data 转字符串① 添加了转换语句② 没有添加转换语句 &#xff08;2&#xff09;字符串str 转 字节data 2、三种方式的比较&#xff0c;K210发送到S…

图解Vit 2:Vision Transformer——视觉问题中的注意力机制

文章目录 Patch Embedding 回顾Seq2Seq中的attentionTransformer中的attention Patch Embedding 回顾 上节回顾 Seq2Seq中的attention 在Transformer之前的RNN&#xff0c;其实已经用到了注意力机制。Seq2Seq。 对于Original RNN&#xff0c;每个RNN的输入&#xff0c;都是对…

vue3项目创建(vite3+ts+elementui-plus)

文章目录 1.创建工程 1.创建工程 目的&#xff1a;vue3vitets 安装依赖&#xff0c;安装vite的工具 Vite下一代的前端工具链为开发提供极速响应v4.3 npm install -g create-vite创建工程 create-vite font-userui --template vue-ts –template vue-ts 后面的是配置模板&#…

CS 144 Lab Zero

CS 144 Lab Zero 环境搭建使用socket写一个网络程序In-memory reliable byte stream 对应课程视频: 【计算机网络】 斯坦福大学CS144课程 Lab 0 对应的PDF: Lab Checkpoint 0: networking warmup Lab 0 会省去Telnet部分内容。 环境搭建 Run Ubuntu version 22.10, then ins…

基于linux下的高并发服务器开发(第二章)- 2.3 进程创建

/*#include <sys/types.h>#include <unistd.h>pid_t fork(void)函数的作用&#xff1a;用于创建子进程返回值&#xff1a;fork()的返回值会返回两次。一次是在父进程中&#xff0c;一次是在子进程中在父进程中返回创建的子进程的ID&#xff0c;在子进程中返回0如何…

《微服务架构设计模式》第十三章 微服务架构的重构策略

微服务架构的重构策略 一、重构到微服务需要考虑的问题1、为什么重构2、重构形式3、重构策略 二、设计服务与单体的协作方式三、总结 一、重构到微服务需要考虑的问题 1、为什么重构 单体地狱造成的业务问题&#xff1a; 交付缓慢充满故障的软件交付可扩展性差 2、重构形式 …

itheima苍穹外卖项目学习笔记--Day6: 微信登录 / 商品浏览

Day6 a. HttpClientGET方式请求&#xff1a;POST方式请求&#xff1a; b. 微信登录 a. HttpClient HttpClient 是Apache Jakarta Common 下的子项目&#xff0c;可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包&#xff0c;并且它支持 HTTP 协议最新…

chrome插件reading-time开发

本插件开发文档翻译于Google官方文档Chrome Extensions Tutorial: Reading time - Chrome Developers 一、reading-time reading-time项目的功能是 将预期的阅读时间添加到任何Chrome extension 和 Chrome Web Store documentation 页面里面 通过这个项目&#xff0c;我们可以…

拓扑序列及其排序

目录 一、拓扑序列及其排序的相关概念拓扑序列的定义拓扑序列的性质出度、入度、度数拓扑排序 二、拓扑序列及其排序的应用有向图的拓扑序列代码实现 一、拓扑序列及其排序的相关概念 拓扑序列的定义 拓扑序列是对一个 有向无环图(DAG)&#xff08;也称为拓扑图&#xff09;而…

SpringBoot整合gRPC -- 简单明了

项目结构 pom引入(parent中引入即可) <properties><net-devh-grpc.version>2.14.0.RELEASE</net-devh-grpc.version><os-maven-plugin.version>1.6.0</os-maven-plugin.version><protobuf-maven-plugin.version>0.5.1</protobuf-mave…

Python绘制一个圆

代码 import matplotlib.pyplot as plt import numpy as npradius 10 # 半径的长度 center np.array([0,0]) # 圆心的坐标 t np.linspace(0, 2 * np.pi, 100) x center[0] radius * np.cos(t) y center[1] radius * np.sin(t)plt.figure(figsize(5,5)) plt.plot(x,y) p…

C# Modbus通信从入门到精通(5)——Modbus RTU(0x03功能码)

1、03(0x03)读保持寄存器 使用该功能码能从远程地址中读取1到125个保持寄存器的值,每个保持寄存器都占两个字节,读取的保持寄存器数量由主站读取时指定。 2、发送报文格式 更详细的格式如下: 从站地址+功能码+起始地址高位+起始地址低位+寄存器数量高位+寄存器数量低位+…

Redis进阶源码 - 主流程源码

redis底层是C语言编写的一个可执行程序&#xff0c;主方法为server.c 中main方法 主要包括&#xff1a;从初始化 到 EventLoop整个流程源码内容介绍 画的分析图太大了&#xff0c;需要的直接下载看吧.....想提醒大家的是&#xff0c;看源码时一定要带着目标去看&#xff0c;比…