requests实现接口自动化(二)
1|0实现测试请求类的两种方式
在TestCases目录下创建测试请求类TestMyRequest,然后获取列表[字典]形式的测试数据,最后使用for循环遍历每一组测试数据
使用unittest运行后,可以发现多条测试用例被合并成了一条测试用例,这显然是不符合我们期望的,我们期望Excel中的每一行的数据都应该对应着一条测试用例
因此,有必要使用ddt对其进行改造,改造后的代码如下
再次运行发现报错了,这是ddt的mk_test_name被我们改造过,必须要求Excel第一列的列名是case_id而非id,改过来后发现可以运行成功
总共9条用例,7条成功,2条失败,我们的目的实现了
这里需要注意几个地方:
- request方法需要的params或data都是字典形式,而Excel读出来的是json字符串,因此需要使用
json.loads()
将其转为Python的字典 - 使用*all_case_data,引用数据变量
- ddt运行时的错误排查,如有必要,去源码里可以看看。这里由于修改源码,导致出现了一些问题,如果源码未修改,不会出现这个问题
2|0实现参数化的两种方式
想象一种情况,如果我们的手机号是写死的,那么手机号正常注册后,下次再运行,注册接口会报错:手机号已注册,如何实现手机号码的动态参数化,是摆在我们面前的一个问题。目前有两种解决办法,一是清库,二是随机生成,在实际项目中,一个账号涉及到的数据是比较多的,不仅有数据库,还有缓存,因此清库这种办法比较麻烦,第二种随机生成是可以做到的。随机生成的手机号又分为两种方式,一种是使用Excel,一种是使用Excel + 时间戳
2|1Excel的方式实现参数化
先看看Excel的方式,下表是case_datas这个工作表的数据,可以用${phonex}
将变量括起来,这个变量表示要做动态替换
在另一个工作表init_data中,将mobilephone和value作为标题,${phone1}和具体的手机号作为初始化值
整个代码我们做了一些微调,DoExel类实例化时去掉了sheetName这个参数,将filePath设置为全局属性,还有最大的一个变化是在all_case_data
生成之后,再去做的替换。因为我们之前的读取所有测试数据的写法是按照zip将两个列表合并,而非逐行逐列读取,逐行逐列的缺点上面也提到了,column写死在代码里,新增一行扩展起来不太方便,亦或是通过双层for循环读取行和列,但这样也得到的是行号和列号,要知道哪一列的列名是request_data,可能还需要再做封装。索性在读取之后替换,拿到每一行的数据case_data,去找key = request_data对应的值即可
在测试请求类TestMyRequests中,增加了setUpClass和tearDownClass方法,后者在测试结束时做个收尾工作,将Excel中init_data工作表中的初始值更新并保存
这样做看起来似乎不错,但基本上都能找到问题,比如read_init_data()方法中的for i in range(1, 4),这个4是我们根据${phonex}的个数+1得到的,但这个值你能控制吗?
同样与之关联的是update_init_data()方法中的5
2|2Excel + 时间戳的方式实现参数化
这种方式采取截取时间戳和号段一起拼接成动态的手机号,然后替换掉Excel中的${phonex},那么问题来了
要解决第3点,我们首先要考虑,${phonex}和随机方法的关联,是不是可以设置随机方法为random_phone()来返回一个动态的手机号,也就是"${phonex}"使用正则表达式去掉${}和x后得到了"phone",这个"phone"和"random“拼接成了"random_phone
,我们怎么调用random_phone()方法呢?python中的eval()可以实现这一功能,eval("random_phone()")执行的就是random_phone()这个方法
,基于这一点,我们完善了一些代码
在Common目录下定义一个RandomGenerate类,这个类是用来随机生成手机号的
在Common目录下,再定义一个ReplaceVariable类,这个类是用来替换请求参数的```
修改DoExcel,修改的目的是去掉一些无用的方法
最后再修改测试请求类TestMyRequests,在里面调用替换方法,替换动态的手机号,运行并查看测试结果
这样做的一些好处我们总结下:
- 数据生成更灵活,不依赖于Excel初始数据,因为不用写Excel,所以Excel打开的情况下也能读取并执行
- 不用统计${phonex}有多少个,再决定生成多少个动态的手机号
3|0实现接口关联的两种方式
在接口关联中,我们要处理两种情况,一种是B接口的请求参数需要依赖A接口的返回结果中的某个值,这种常见的例子是获取验证码和登录,登录接口的请求参数中的验证码是从获取验证码接口的返回结果中拿到的;另一种是B接口的请求参数需要依赖A接口的请求参数中的某个值,这种常见的例子是重复注册和注册后登陆
使用我们旧的参数化方法,也就是Excel init_data做初始化,不存在第二种情况,只要保证注册接口和重复注册接口的变量符号一致(都是${phone2})就行,${phone2}在init_data字典中对应的值是init_data["phone2"],但是新的参数化方法就不一样了,直接忽略掉了后缀的数字(2),然后拼接成random_phone,每次都通过使用eval()方法动态的调用random_phone()方法,因此重复注册接口获取到的手机号也是动态生成的,所以需要针对这一问题做相应的处理
3|1设置全局变量
具体的思路:
Excel中的设计也不难
代码中需要对测试请求类TestMyRequest做一些调整,一个是断言前提取并存入全局变量,一个是请求前判断并做替换
3|2引入反射
反射是个动态的概念,指的是脚本运行过程中自动的给反射类添加属性,可以理解成一个类似字典一样的容器,只不过我们的对象是类,通过调用类.属性名
的方式获取到依赖的数据,拿到依赖的数据再做一次替换即可。根据这个原理,我们可以将思路整理下
Excel中需要加上一些反射的列和反射特有的标识{{参数名}}和提取表达式
在Common下创建一个反射类Context
修改参数替换类ReplaceVariable类,主要加入对{{参数}}}的判断和替换
最后修改测试请求类TestMyRequest类,运行并得到返回结果
4|0优化:断言正则化
请看一种场景,投资接口返回的测试数据是动态变化的,类似下面这种形式:
在这里返回结果中,如果使用self.assertEqual()显然不合适,对于这个接口,我们应该只关心字段中的status、code、mobilephone、leaveamount以及msg
,因为就要做部分匹配了,部分匹配我们首先想到的是正则表达式,实际上也确实是这样。对于校验字段,其他的还好,只有mobilephone需要给case_data["expect_data"]做替换
,那么我们把Excel中的expect_data处理一下
然后测试请求类TestMyRequest中对case_data["expect_data"]做替换
最后使用self.assertIsNotNone和re.search()结合做断言
5|0优化:接口关联之补充
在接口关联那一部分,我们只看了一种情况,就是重复注册接口依赖注册接口的请求手机号,但是依赖返回结果的情况没有说,这里再来看一个场景,获取投资列表接口的请求参数memberId来自于投资接口返回结果中的id,这样先从设计Excel开始,可以把投资接口的response_context设置为响应结果的提取表达式user_id="id"😦\d+),再把获取投资记录里的请求数据中的memberId的值参数化{{user_id}}
剩下的我们就去测试请求类TestMyRequest中对提取到的响应结果做反射
__EOF__

本文链接:https://www.cnblogs.com/my_captain/p/12762532.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?