python-自动化测试- 多接口动态参数设计

什么叫做多接口的动态参数处理?

测试数据都放在excel中管理,每个接口如果有提取的数据就直接放在excel里写好,到时候直接读取出来做响应的提取操作即可。

  • 电商项目: 购物车 token proId skuID等 需要执行多个接口 获取返回值;

  • 业务流: 前面过很多步骤 【中间步骤都是单独的一个接口的请求】

  • 以上情况 都不太适合用conftest夹具测试使用。因为前置很多 处理比较麻烦。

  • 参考postman的处理方法。

    • 先执行前置登录-- 正常接口测试
    • 执行之后,提取数据-- 存在环境变量— 共享的 后面每个接口都可以调用数据,变量
    • 后面接口调用 – {{变量}} === 这个是{{}}是一个占位符,用你从环境变量里取到值 替换掉这个位置的数据 【Jmeter - ${}】
  • 设计的思路:业务流: 登录-搜索-进入详情页-添加购物车-查询购物车-结算-提交订单

    • 先把业务流的接口用例都写出来,在excel表格里统一管理表格设计好之后,我们需要用代码来实现: 提取数据---->存储环境变量—> 查找占位符 —> 替换变量的一系列操作。我们一步一步完成。
      • 1、关联的接口 需要提取的数据也提取出来: 加一个提取响应字段在excel里,用jsonpath提取
      • 2、代码提取出来后,保存在环境变量里 == 类 动态属性
      • 3、其他接口要用的位置用占位符表示,后面用代码替换成为 -环境变量里存的值。
  • 第一步:提取出来需要的响应字段的值 - 用jsonpath
    思路如下:

    • 1、先从excel标题读取【提取响应结果数据】这列; – 读取出来是字符串
    • 2、转化为字典-- json.loads()反序列化
    • 3、分别渠道这个提取表达式里的 key 和value ,key是字段名,value是jsonpath表达式。 – 用for循环遍历
    • 4、从接口的响应结果里使用这个jsonpath表达式提取数据。
  • 第二步:将响应字段存储到环境变量中(键-值,可以有多组): 数据读取出来后,要存起来: 全局共享给所有用例可用。

    • 用类的动态属性存储提取是的数据。
    • 类和类的属性 存出 环境变量的变量名 和值。 == setattr getattr
  • 第四步:用占位符包裹要替换的变量,然后用环境变量里的数据替换占位符位置的变量名。

    • 难点:代码如何自动识别这些要替换的数据?–用占位符 ; 占位符包裹的变量名出来? — 正则表达式匹配
      如果能识别出来,我们后续其实就比较简单了:
      • 1、取出来占位符中的变量名: 读取头部和参数的时候,判断是否有替换的值。有就替换。
      • 2、从环境变量获取属性值-- 变量值
      • 3、将变量名替换为属性值,再去用于发送接口请求【头部也有,参数也有】
"""
思路如下:
1、先从excel标题读取【提取响应结果数据】这列; -- 读取出来是字符串
2、转化为字典-- json.loads()反序列化
3、分别渠道这个提取表达式里的 key 和value ,key是字段名,value是jsonpath表达式。 -- 用for循环遍历
4、从接口的响应结果里使用这个jsonpath表达式提取数据。
"""
# 从excel里读取出来的 提取形影结果的表达式
import json
from jsonpath import jsonpath# 这个类就是为了存储环境变量 实现环境变量的共享的
class EnviData:passresponse = {"access_token":"0efdce50-0e2f-4ed0-b4d1-944be5ab518a",
"token_type":"bearer","refresh_token":"4bfc3638-e7e4-4844-a83d-c0f8340bc146",
"expires_in":1295999,"pic":"http://mall.lemonban.com:8108/2023/09/b5a479b28d514aa59dfa55422b23a6f0.jpg",
"userId":"46189bfd628e4a738f639017f1d9225d","nickName":"lemon_auto","enabled":True}extract_data = '{"access_token":"$..access_token","token_type":"$..token_type"}'# 第一步: 反序列化 -字典
extract_data = json.loads(extract_data)
for k,v in extract_data.items():  # k 是access_token 变量名字,v是$..access_token# 使用jsonpath表达式 提取login响应结果里的值value = jsonpath(response,v)[0]  # 是access_token的具体值print(value)# 存起来到环境变量里去setattr(EnviData,k,value)
print(EnviData.__dict__)

运行结果如下:

0efdce50-0e2f-4ed0-b4d1-944be5ab518a
bearer
{'__module__': '__main__', '__dict__': <attribute '__dict__' of 'EnviData' objects>, '__weakref__': <attribute '__weakref__' of 'EnviData' objects>, '__doc__': None, 'access_token': '0efdce50-0e2f-4ed0-b4d1-944be5ab518a', 'token_type': 'bearer'}

正则表达式提取

  • 正则表达式是一组由字母和符号组成的特殊文本, 它可以用来从文本中找出满足你想要的格式的句子.
  • 主要针对字符串:
    • 1、判断字符串是否匹配我的规则
    • 2、提供正则表达式,从字符串提取出来匹配的内容。
  • 正则非常强大,开发特别是前端开发用的很多,语法非常多,没有必要都掌握,用到了再去查就可以。目前先学习我们要用的即可。

re相关的文章: https://www.cnblogs.com/Simple-Small/p/9150947.html

regular表达式学习手册: https://tool.oschina.net/uploads/apidocs/jquery/regexp.html(规则)

https://gitee.com/thinkyoung/learn_regex

在线的正则验证:https://c.runoob.com/front-end/854/

  • 正则的语法规则:

    • 1、匹配一个字符 (元字符)
      • \d 只匹配数字0-9
      • \w 匹配[0-9A-Za-z_] 数字字母下划线 支持中文
      • . 除了换行符(\n)以外的所有字符。
    • 2、正则的匹配次数
      • *匹配前一个字符,0次或者多次 ==任意次
      • +匹配前一个字符,1次或者多次
      • ?匹配前一个字符,0次或者1次
  • 我们用的做多就是万能表达式: 非贪婪匹配的 .*?

    • ? 非贪婪匹配模式:找到了## 两个后 不会再找了就匹配成功了;
      • 贪婪模式:尽可能去进行更多的匹配
      • 非贪婪模式:尽可能少的去进行匹配
  • Python的正则的库,内置库 re , 直接导入re 库,免安装

    • re模块函数 : findall(),search()
      • findall(正则表达式, 目标字符串) ,字符串从头到尾去匹配,只要符合要求就会拿出来
        • 多个符合的结果 存到列表里,返回一个列表。
        • 如果只想获取里面的变量名 不需要这个## 限定符,可以加个括号括起来: 加了括号,就是只提取括号里的内容,就是左右边界了。
      • search(正则表达式, 目标字符串)方法
        • 搜索查找,如果匹配的正则符合的话,返回Match类型的对象,不符合就返回None
        • Match类型的对象(search函数的返回值)的方法group() - 正则分组,可以返回的匹配的整体子串-整体占位
          符内容 #prodId#
        • search函数找到了第一个符合的之后,它就不会再继续往后去查找
"""
*
re模块函数 : findall(),search()* findall(正则表达式, 目标字符串) ,字符串从头到尾去匹配,只要符合要求就会拿出来* 多个符合的结果 存到列表里,返回一个列表。* 如果只想获取里面的变量名 不需要这个## 限定符,可以加个括号括起来: 加了括号,就是只提取括号里的内容,## 就是左右边界了。* search(正则表达式, 目标字符串)方法* 搜索查找,如果匹配的正则符合的话,返回Match类型的对象,不符合就返回None* Match类型的对象(search函数的返回值)的方法group() - 正则分组,可以返回的匹配的整体子串-整体占位符内容 #prodId#* search函数找到了第一个符合的之后,它就不会再继续往后去查找- 循环找: 先找到第一个,替换掉这个; 继续第二次,替换掉,第三次。。。。- 确定循环次数么?--不能确认循环次数的时候,用while。- while循环先进去,找不到占位符 -- 返回值None ,跳出循环。思路:
1、环境变量里已经有了 属性名 --属性值
class EnviData:prodId = 7717skuId = 4563
2、先从类里获取属性值 -- getattr(EnviData,prodId) === prodId这个名字
3、先用正则找到这个字符串里的 占位符标记的字符串 ,replace(标记符,类属性值)注意: 做的事情
- 第一个: 取到 #prodId#  == 被替换掉的子字符串
- 第二个: prodId  == 获取类属性变量。
"""import restr_data = '{"basketId": 0, "count": 1, "prodId": #prodId#, "shopId": 1, "skuId": #skuId#}'# findall(正则表达式, 目标字符串) ,字符串从头到尾去匹配,只要符合要求就会拿出来
result = re.findall("#.*?#",str_data) # 结果是  #prodId#
print(result)
# 得到## 限定符里面的变量名:--加上括号就只会得到 #里面的值#
var_name = re.findall("#(.*?)#",str_data) #结果  prodId
print(var_name)# search(正则表达式, 目标字符串)方法
result = re.search("#(.*?)#",str_data) # 结果是一个对象
print(result)
# 对象的group()方法 - 正则分组,可以返回的匹配的整体子串
value = result.group()  # 结果是  #prodId#
print(value)
var_name = result.group(1) # 第一个分组的值 结果是 prodId
print(var_name)# 没有匹配到结果--None
result = re.search("#.*?!#",str_data) # 结果是一个对象
print(result)

运行结果如下:

['#prodId#', '#skuId#']
['prodId', 'skuId']
<re.Match object; span=(38, 46), match='#prodId#'>
#prodId#
prodId
None

循环正则提取

"""
*
re模块函数 : findall(),search()* findall(正则表达式, 目标字符串) ,字符串从头到尾去匹配,只要符合要求就会拿出来* 多个符合的结果 存到列表里,返回一个列表。* 如果只想获取里面的变量名 不需要这个## 限定符,可以加个括号括起来: 加了括号,就是只提取括号里的内容,## 就是左右边界了。* search(正则表达式, 目标字符串)方法* 搜索查找,如果匹配的正则符合的话,返回Match类型的对象,不符合就返回None* Match类型的对象(search函数的返回值)的方法group() - 正则分组,可以返回的匹配的整体子串-整体占位符内容 #prodId#* search函数找到了第一个符合的之后,它就不会再继续往后去查找- 循环找: 先找到第一个,替换掉这个; 继续第二次,替换掉,第三次。。。。- 确定循环次数么?--不能确认循环次数的时候,用while。- while循环先进去,找不到占位符 -- 返回值None ,跳出循环。思路:
1、环境变量里已经有了 属性名 --属性值
class EnviData:prodId = 7717skuId = 4563
2、先从类里获取属性值 -- getattr(EnviData,prodId) === prodId这个名字
3、先用正则找到这个字符串里的 占位符标记的字符串 ,replace(标记符,类属性值)注意: 做的事情
- 第一个: 取到 #prodId#  == 被替换掉的子字符串
- 第二个: prodId  == 获取类属性变量。
"""import restr_data = '{"basketId": 0, "count": 1, "prodId": #prodId#, "shopId": 1, "skuId": #skuId#}'
class EnviData:prodId = 7717skuId = 4563while True:# search(正则表达式, 目标字符串)方法result = re.search("#(.*?)#",str_data) # 结果是一个对象if result is None:  # 如果没有占位符 就是None 跳出循环breakmark = result.group()  # 结果是  #prodId# --要被替换的子字符串var_name = result.group(1) # 第一个分组的值 结果是 prodId# 从环境变量里获取变量名对应的属性值  prodId-- 属性值 7717,替换的数据var_value = getattr(EnviData,var_name)  # 结果 : 7717--int类型# 目标字符串的替换,赋值给一个变量# 注意:replace方法要求 两个参数都应该是字符串。str_data = str_data.replace(mark,str(var_value))print(str_data)

运行结果如下:

{"basketId": 0, "count": 1, "prodId": 7717, "shopId": 1, "skuId": #skuId#}
{"basketId": 0, "count": 1, "prodId": 7717, "shopId": 1, "skuId": 4563}

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

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

相关文章

vue 隐藏导航栏和菜单栏,已解决

初始效果&#xff1a; 效果&#xff1a; 出现问题&#xff1a; 解决方法&#xff1a;

Java解决幸运数字

Java解决幸运数字 01 题目 哈沙德数是指在某个固定的进位制当中&#xff0c;可以被各位数字之和整 除的正整数。 例如 126 是十进制下的一个哈沙德数&#xff0c;因为 (126)10 mod (1 2 6) 0; 126 也是8进制下的哈沙德 数&#xff0c;因为(126)10 (176)8&#xff0c;(126)10…

第十四届蓝桥杯省赛Python组真题(未完)

AcWing 4965. 三国游戏 - AcWing 法1&#xff1a;dfs的时间复杂度是2^n 对于每一个我们有选与不选两种 //法1&#xff1a;dfs #include <bits/stdc.h> using namespace std; #define int long long #define x first #define y second typedef pair<int, int> PI…

使用docker-compose搭建wordpress博客

1、从远程仓库拉取worldpress镜像到本地 2、新建一个项目&#xff0c;然后在新建的项目目录里面新建一个docker-compose.yml模版文件。 3、编写docker-compose.yml文件 4、docker-compose up 运行项目。 5、在浏览器测试 使用docker-compose搭建wordpress博客实验成功。

Rust 实战练习 - 1. 输入,输出,环境变量,字符,字符串

目标&#xff1a; 获取程序命令行参数标准输入输出获取环境变量字符串&#xff0c;字符初步学习 cargo传递参数&#xff0c;需要加上-- use std::{env, ffi::OsString, io, io::Write};fn main() {println!("OS Env: {:?} > {:?}", env::current_dir().unwra…

VUE3——watch函数

与Vue2.x中watch配置功能一致 两个小“坑”&#xff1a; 监视reactive定义的响应式数据时&#xff1a;oldValue无法正确获取、强制开启了深度监视&#xff08;deep配置失效&#xff09;。监视reactive定义的响应式数据中某个属性时&#xff1a;deep配置有效。 //情况一&#x…

配置wss和隐藏端口号(WebSocket通信)

修改宝塔面板配置文件&#xff1a; 添加这几行代码&#xff1a; location /wss{proxy_pass http://127.0.0.1:23481; # 根据自己的socket端口号修改proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "Upgrade";proxy_s…

小技巧系列——Ubuntu下查看Eigen版本的一种方法(一)

小技巧系列——Ubuntu下查看Eigen版本的一种方法&#xff08;一&#xff09; 说明命令 说明 如何在Ubuntu下查看Eigen版本 命令 pkg-config --modversion eigen3

全网最详细的 Ubuntu 18.04 安装Livox mid-360驱动,测试 fast_lio2

目录 一、前言 二、依赖的环境 三、 安装Livox-SDK2&#xff0c;fast_lio2 和 livox_ros_driver2 (1) 安装Livox-SDK2 (2) 安装 fast_lio2 和 livox_ros_driver2 四、mid-360 设备硬件设置 五、运行设备 六、topic信息查看 一、前言 Livox mid-360需要使用Livox-SDK2…

【OceanBase OBCP题目解析17】关于OceanBase事务引擎一致性特点,描述正确的是

本文为云贝教育郭一军&#xff08;微信&#xff1a;guoyJoe&#xff09;原创&#xff0c;请尊重知识产权&#xff0c;转发请注明出处&#xff0c;不接受任何抄袭、演绎和未经注明出处的转载。 关于OceanBase事务引擎一致性特点&#xff0c;描述正确的是 &#xff1f; A. 保证…

海外媒体宣发:企业出海最有“范儿”的几大媒体

1. 雅虎财经&#xff08;Yahoo Finance&#xff09; 雅虎&#xff08;英文名称&#xff1a;Yahoo&#xff0c;NASDAQ&#xff1a;YHOO&#xff09;是美国著名的互联网门户网站&#xff0c;也是20世纪末互联网奇迹的创造者之一。其服务包括搜索引擎、电邮、新闻等&#xff0c;业…

【面试经典150 | 动态规划】零钱兑换

文章目录 Tag题目来源解题思路方法一&#xff1a;动态规划 写在最后 Tag 【动态规划】【数组】 题目来源 322. 零钱兑换 解题思路 方法一&#xff1a;动态规划 定义状态 dp[i] 表示凑成总金额的最少硬币个数。 状态转移 从小到大枚举要凑成的金额 i&#xff0c;如果当前…

openssl3.2 - exp - BIO_push()超过2个节点的应用- 以(aes-128-cbc + base64)为例

文章目录 openssl3.2 - exp - BIO_push()超过2个节点的应用- 以(aes-128-cbc base64)为例概述笔记END openssl3.2 - exp - BIO_push()超过2个节点的应用- 以(aes-128-cbc base64)为例 概述 BIO_push()形成了一个链. 理论上, 多个BIO连在一起, 只需要向BIO链头写数据, 然后B…

详解ARP攻击原理、类型、机制、欺骗主机、仿冒网关、泛洪攻击,以及网络攻击中如何快速判断客户端是否存在恶意连接?

详解ARP攻击原理、类型、机制、欺骗主机、仿冒网关、泛洪攻击,以及网络攻击中如何快速判断客户端是否存在恶意连接? ARP攻击(Address Resolution Protocol attack)是一种网络攻击技术,它利用了ARP协议的设计缺陷来实施攻击。ARP是网络协议中用于将网络层的IP地址解析为链路…

舵机烧录

舵机烧录 一、硬件连接1、准备物资2、连接&#xff08;1&#xff09;舵机线一侧连接舵机控制板&#xff0c;另一侧连接舵机&#xff08;2&#xff09;老安卓线一侧连接舵机控制板&#xff0c;一侧连接电脑&#xff08;3&#xff09;接上低压电池 二、软件使用1、打开舵机烧录软…

表格中的状态类型值(tag)

一&#xff1a;数字转换为简单的中文值 ** 不用转换直接用find()方法&#xff1a;在statusList里找&#xff1b; **lastHandleCode是对应的获取到的每行数据的code值&#xff1b; vue: <el-table-column label"执行状态" align"center"><templat…

Vmware虚拟机无法用root直连说明

Vmware虚拟机无法用root直连说明 背景目的SSH服务介绍无法连接检查配置 背景 今天在VM上新装了一套Centos-stream-9系统&#xff0c;网络适配器的连接方式采用的是桥接&#xff0c;安装好虚拟机后&#xff0c;在本地用ssh工具进行远程连接&#xff0c;ip、用户、密码均是成功的…

【Java程序设计】【C00384】基于(JavaWeb)Springboot的民航网上订票系统(有论文)

【C00384】基于&#xff08;JavaWeb&#xff09;Springboot的民航网上订票系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;已经做了六年的毕业设计程序开发&#x…

如何简单在手机上/移动端测试web程序

也许你在搜索到如何在手机上测试web的方法是&#xff1a; Chrome DevTools模拟手机调试 岩鼠平台真机调试 weinre远程调试工具 等等等待 但也许只是需要在手机上简单试用一下我们开发的web 目录 一、前置条件 二、安装Live Server扩展 三、以Live Server运行程序 四、访问…

JS快速排序模板

912. 排序数组 给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 示例 1&#xff1a; 输入&#xff1a;nums [5,2,3,1] 输出&#xff1a;[1,2,3,5] 示例 2&#xff1a; 输入&#xff1a;nums [5,1,1,2,0,0] 输出&#xff1a;[0,0,1,1,2,5] 提示&#xff1a; 1 <…