最近要开展接口测试,起初打算使用公司已有的Fitnesse测试工具来进行接口测试。过程中发现,构造接口字段数据、测试数据都比较困难,接口参数多的时候,用例量就会很多,关键执行速度还慢。所以放弃了。
找了一些其它工具,都不太能解决数据构造困难的问题。找不到工具,就直接使用代码来实现。考虑到代码量,结合网上的一些推荐,决定使用python+pytest来编写接口自动化用例。
决定了语言和框架,接下来要考虑一下实现需求。
需求一:一套用例可以测试多套环境
公司的测试环境不止一套,希望在使用接口自动化用例时,可以随意的切换被测环境。
为了满足这个需求,首先要完成接口地址等信息的独立配置,而且是要按照一套环境的维度去管理信息。
我的做法如上图,首先我给每套环境设置了一个别名,比如上图中的lion环境,然后设计了一个服务去持久化变量值信息(变量名称所有环境保存一致)
接着将环境名称和变量名称,组合起来,保存到redis中(如上图),供后续接口自动化用例读取并使用。
环境信息搞定之后,接下来的任务就是,设计一种方法让接口自动化用例使用环境信息。
这里采用的方法是,在执行时,指定环境别名。
pytest的用例有多种执行方式,这里使用pytest.main()来启动,通过将pytest.main()写入一个py文件中,如下面代码。
启动时,接受一个参数env,并将env作为属性添加到Context中,供用例使用。
调用命令:
以上就实现了多环境测试的需求。后续只要维护好环境别名、变量名称和变量值就可以了。
需求二: 可以被jenkins调度执行
这个比较简单,通过参数化构建就可以。
不过为了不影响Jenkins所在服务器,我使用了docker去执行用例
下面是Dockerfile的配置
下面是jenkins中的Execute shell
需求三 拥有测试报告
测试报告使用的是Allure,主要是美观且配置简单,(参考:https://docs.qameta.io/allure/#_pytest)
step1:配置报告路径
step2:编写用例时,添加注释
step3:在jenkins中安装插件
step4:在job中配置报告路径
step5:在另一个job中添加执行计划
step6:查看报告
需求四:接口中某些字段值在每次请求中不重复
这里通过python的一个库factory-boy来实现该需求。
大概的原理就是将每个接口当做一个对象来处理,通过factory-boy给每个字段添加值,可以是固定值,也可以是随机值。然后将对象转成dict,并发送请求。
如下图中的红框部分字段,每次请求都将是不同的值。
需求五: 可以多接口关联测试
针对这个需求,实现的主要思路是,可以在一条Pytest用例中,拿到所有接口的请求和响应参数。
这里利用了pytest中fixture,将每个接口的http请求方法封装成fixture,后续传递给pytest用例使用。同理实现了 加载用例数据的Fixture
下面是用例数据,可以看到request中传递的是一个函数,函数执行后,可以拿到两个请求的请求参数。
下面的是pytest用例,可以看到用例中可以同时维护两个请求接口的请求参数和响应内容
这里例子比较简单,更新请求中,需要使用到添加响应中的data字段值。
需求六 构造的表数据可以和接口字段数据关联
有时候没有办法,通过其它接口的调用得到的信息,来为当前测试接口做数据入参。可偏偏需要在数据库中存在数据,才可以调用当前测试接口。
可以利用Factory-boy和sqlalchemy来实现这个需求。利用Factory-boy生成随机数据,利用sqlalchemy将数据入库。
例如下面pytest用例的红框部分,就是在插入数据,并使用数据中black_index,作为当前测试接口的请求入参
下面是CreateMBL函数的实现
下面是Factory-boy生成数据的代码
需求八 针对多样的响应内容,具备多样的断言方式
起初在用例的response中,只存放了一个dict,如下图,但是有时候响应内容(json格式)是多样的,需要断言的字段不一定都在json的顶层结构中,可能还会出现嵌套dict以及list的情况。
下面是我的实现。主要的思想就是根据不同的断言需求,传递给不同的断言方法。
用例中调用下面的函数,可以生成一批断言集合。
当断言需求类型是dict的时候,会调用下面的函数。
用例response编写,指定不同的断言需求
pytest 用例使用,如红框部分,结合上面的用例的断言需求,在用例执行时,实时传入实际响应内容。再遍历执行断言函数集合。就完成了多样的断言需求
作者:CC爱测试
原文链接:https://blog.csdn.net/waitingwww/article/details/119654397