本文章将介绍接口自动化所覆盖的接口测试场景和接口测试断言的深度
场景:
1.单接口各类接口异常传参组合
2.多接口集成执行,模拟业务场景
断言深度:
1.HTTP状态码校验
2.接口返回值校验
3.接口返回值内包含json校验
4.数据库结果校验
一,用到的第三方库一览:
parameterized==0.6.1
mysqlclient==1.3.13
requests==2.18.4
rsa==4.0
wheel==0.32.2
configparser==3.5.0
sshtunnel==0.1.4
文档目录结构:
文档目录介绍:
1.mysql_dml该目录存放sql执行方法,在后续需要执行sql语句时,调用该文件下的类即可
2.public_api 目录为所有接口请求类,每个接口为类中的一个方法
3.service_logic 所有接口的共用逻辑,在此文件夹内实现(如2个或者3个接口以上,在进行集成接口调用时经常被使用到的,可以拆出来放在这个文件夹)
4.test_case 测试方法的main函数,所有测试方法主入口在这里执行
5.test_data 测试数据,csv文件管理的测试数据在该文件中存放
6.test_report测试报告,存放HTML测试报告文件
7.utils 该文件存放接口测试时需要用到的工具,比如公私钥加密的方法,日志类,HTML测试报告类,数据库连接器等
执行过程如下:
首先test_case测试方法主入口,都加入了一个装饰器:
getJsonData接收一个参数:测试用例文件的url
将文件路径传入至该函数中时,该方法会将csv中得到的数据,序列化为dict数据,例如csv中数据如下:
case_name api_url type header .......
登录 /login post {"content-type":""}........
第二行
转为:[{"case_name":"登录","api_url":"/login","type":"post"...},{第二行}]
转为列表包字典的数据格式后,传入paranmeterized.expand()方法
该方法的作用是会根据列表的长度生成以下标从0开始的方法个数,比如:
我在test_login(self,data):方法上加入该装饰器,csv文件中有2行数据,那么运行时会生成test_login0(self,data),test_login1(self,data)的方法个数
然后调用unittest.main调用所有以test_开头的的方法,即可达到循环传参的方式了。
csv中字段详解:
caseName,:测试用例名称
apiUrl, 测试用例url(注意不包含域名,域名卸载config.ini配置文件中)
type,(接口类型,post,get或其他的,需要其他的可自行扩展)
header,(默认的请求头,{"content-type":"application/json"})
precondition_type,(前置条件类型,目前三种:为空,script,sql)
precondition,(前置条件具体数据)
on-off,(单接口执行的开关)
jsonData,(json数据)
assertWay,(断言方式,return_result,sql)
assertField, (断言的字段)
assertValue(断言的值)
这里着重讲解precondition_type,precondition,jsonData的关系:
如果前置条件选择为空的话,precondition则也为空
如果precondition前置条件选择为script的话,precondition的值为{"$需要替换的字段":"需要替换的取值方式"},假如json数据为{"a":{"b":"$c"}}
上个接口返回的数据为{"d":{"c":"e"}},其中C这个值需要从这个返回结果中取出,precondition则要设置为{"$c":"d|c"},这样json数据就能成功被替换,多个的话也是支持的
如果precondition前置条件选择为sql的话,precondition的值为{"$需要替换的字段":"需要替换的sql语句"},在测试过程中,有些接口需要从数据库中得到一些数据才能测试,这样的情况下,可以使用sql的方式去对json数据做替换,写法为
{"$c":"select id from user where name='张三'"} 这样我们就能将查询出的结果替换给json了
另外:assertWay,assertField,assertValue也很重要
其中assertWay如果选择为sql的话,
断言的值为取json的数据,例如json_result 为 {"a":{"b":"c"}},取b的值为a|b
assertValue 直接填写sql语句例如,select.........
如果assertWay为return_result的话,就顾名思义了,直接查询返回结果对不对,取值方式和上面一样也是a|b|c之类的
多接口集成测试差点忘记讲了:
由于上面部分全部讲的是单接口运行,所以在串联的时候,当然不需要paranmeterized.expand()该装饰方法了,所以调用public_api文件中的接口时,调用方式需要改变为:
接口方法(csv中第几行)例如:login_api(1) 这个1为csv中第一行的数据,于是就是用csv中第一行的数据执行该接口,
如果集成多接口的场景为登录,新增某条数据,注销则为:
login_result = login_api(1)
login_required = login_result.json()['Authorization']
insert_data_api(1,header=login_required)
logout_api(1,header=login_required)
另外还记得之前csv字段提到的on-off字段吗,那个字段是为了表示有些数据只能在集成的时候用到,所以将字段改为OFF的情况下,代码在单接口执行的情况下将不会执行这行数据
另外附上源码,如果有优化意见有待改进的地方,欢迎指出
https://github.com/ZhangWei55kai/api_testV3.0