使用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()还有个用法,就是加上分割次数,就能改变分割结果。重新修改了代码后,再运行代码,就全都断言通过了。

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

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

相关推荐
数据小爬虫@1 分钟前
利用Python爬虫获取淘宝店铺详情
开发语言·爬虫·python
编程修仙1 小时前
Collections工具类
linux·windows·python
芝麻团坚果1 小时前
对subprocess启动的子进程使用VSCode python debugger
linux·ide·python·subprocess·vscode debugger
EterNity_TiMe_2 小时前
【论文复现】神经网络的公式推导与代码实现
人工智能·python·深度学习·神经网络·数据分析·特征分析
Stara05112 小时前
Git推送+拉去+uwsgi+Nginx服务器部署项目
git·python·mysql·nginx·gitee·github·uwsgi
坐公交也用券2 小时前
使用Python3实现Gitee码云自动化发布
运维·gitee·自动化
hence..2 小时前
Vscode写markdown快速插入python代码
ide·vscode·python
DanielYQ3 小时前
LCR 001 两数相除
开发语言·python·算法
vener_4 小时前
LuckySheet协同编辑后端示例(Django+Channel,Websocket通信)
javascript·后端·python·websocket·django·luckysheet
封步宇AIGC4 小时前
量化交易系统开发-实时行情自动化交易-4.2.3.指数移动平均线实现
人工智能·python·机器学习·数据挖掘