使用pytest+openpyxl做接口自动化遇到的问题

最近使用pytest+openpyxl做了个接口自动化的小项目,遇到了一些问题。

首先,使用pytest这个框架,主要是使用了@pytest.fixture, @pytest.mark.parametrize这两个fixture去做参数化,里面注入的数据是用openpyxl来实现的。

接口介绍:

由上,对登录接口做fixture, 以便后两个接口获取其返回的uuid和token。

具体设置如下:

如上图所示,login这个fixture最终返回一个全局变量的字典,字典里保存uuid,token的值,这个值就是登录后的响应内容提取出来的,调用fixture的request参数实现了把接口响应内容的uuid,token保存到全局变量字典gv中。

接着,让2,3两个接口去调用登录这个fixture的返回值以及从excel表格读取的测试用例相关数据进行测试。

第二个fixture--login_tai是用来传递excel表中的测试用例数据,在下面的参数化里使用了这个fixture,并且带上数据来源data_login_tai,login这个fixture来传递uuid,token值,同样都带上数据来源datas. indirect一定要设置为True, 代表是作为函数传进去的。

看接口测试代码部分:

首先调用login_tai这个fixture获取参数部分的值,然后用从login这个fixture返回的uuid,token去替换,让params这个值是有登录的uuid,token值的。最后调用断言工具类AssertUtil.assert_result()方法去对接口进行断言。

整个流程就是这个样子,很简单,从两个fixture中分别获得想要的数据,然后完成参数的替换,和测试数据的组装到发送请求,获得接口响应,最后做断言。问题就出在最后断言部分,总是出问题。

打印出 响应部分的值的类型,才知道接口响应返回的数字一般是int型,而我们存放测试用例的表格中数字肯定都是字符串,所以这里断言Failed了。

把相关代码改一下

这里value_real部分加个str(),去强转下类型,这样就不会因为类型不一样而断言失败了。

这里还要注意多一点:jsonpath.jsonpath(res,key) 这个方法其实返回的是一个列表,因为它会返回第一个成功匹配的元素但是是存放在列表里的,所以这里取值的时候要加个索引,不然又是数据类型不一样。

把代码变成不加索引的,

打印出来它的类型,可以看到如下结果

如上图,响应返回值是list类型,所以为了达到预期值,都要加上索引。

接下来,又发生一件很难理解的问题。如下图,断言部分,响应结果是如下的'msg': '客户端非法请求:token.len应该小于等于64,但现在token.len = 66',和我们在excel表格中设置的assertFields中的值是一样的,但就是断言失败AssertionError

运行了好几次,检查了好几次代码,还是这样,最后,我想着把断言方法里的value和value_real打印出来看看,到底哪里不一样,怎么老是断言失败。

结果打印出来是这样,

最后发现是这里出了问题,我以为是excel表格读取出了问题,但是想想读取其他数据都没问题,不可能是读取出了问题。最后,恍然大悟,因为在断言方法里用了个'='来分割assertFields字符串的值,因为'='右边的值中也有=,才导致了这个问题。

字符串的split()方法这么使用,就是默认使用'='分割,那遇到'='就分割,就会出现上图那样的问题。研究了一会,发现split()还有个用法,就是加上分割次数,就能改变分割结果。重新修改了代码后,再运行代码,就全都断言通过了。

就是这么个分割方法,竟然导致我运行多次代码,都得不到预期的结果。

总结:学习接口自动化,代码基础非常关键,有的时候莫名其妙的问题就是因为代码基础不牢导致的。稍微改动一下,就能影响整个测试过程的走向。

相关推荐
用户277844910499310 小时前
借助DeepSeek智能生成测试用例:从提示词到Excel表格的全流程实践
人工智能·python
JavaEdge在掘金12 小时前
ssl.SSLCertVerificationError报错解决方案
python
我不会编程55512 小时前
Python Cookbook-5.1 对字典排序
开发语言·数据结构·python
工业通讯探索者13 小时前
ProfiNet转CANopen协议转换网关驱动新能源汽车生产线多轴同步控制
自动化·工业物联网·协议转换网关·网关模块·总线协议
老歌老听老掉牙13 小时前
平面旋转与交线投影夹角计算
python·线性代数·平面·sympy
满怀101513 小时前
Python入门(7):模块
python
无名之逆13 小时前
Rust 开发提效神器:lombok-macros 宏库
服务器·开发语言·前端·数据库·后端·python·rust
你觉得20513 小时前
哈尔滨工业大学DeepSeek公开课:探索大模型原理、技术与应用从GPT到DeepSeek|附视频与讲义下载方法
大数据·人工智能·python·gpt·学习·机器学习·aigc
啊喜拔牙13 小时前
1. hadoop 集群的常用命令
java·大数据·开发语言·python·scala
__lost14 小时前
Pysides6 Python3.10 Qt 画一个时钟
python·qt