在参与我们测试平台开发的时候,结识了HttpRunne这个优秀的开源接口测试框架,初步研究发现HttpRunner可以非常方便、非常高效地实现接口自动化测试。
01 HttpRunner和常用接口测试框架对比HttpRunner 是一款面向 HTTP(S) 协议的通用测试框架,通过编写和维护一份YAML/JSON脚本,即可实现接口自动化测试。
测试用例集:对应一个文件夹,包含单个或多个测试用例(YAML/JSON)文件测试用例:对应一个 YAML/JSON 文件,包含单个或多个测试步骤测试步骤:对应 YAML/JSON 文件中的一个 test,描述单次接口测试的全部内容,包括发起接口请求、解析响应结果、校验结果。
2.1测试集数据结构
## 这个list相当于一个测试用例集或者测试用例
[
{ "config": {...}},
{ "test": {...} ## 这个test就是一个测试步骤 },
{ "test": {...} }
]
2.2 config数据结构
{
‘name’: ‘testName’, ## 必填,测试用例的名称,测试报告会以此作为标题
‘parameters’: [] , ## 非必填,全局参数,作用域为整个测试用例
‘variables’: [], ## 非必填,全局变量,作用域为整个测试用例
‘request’: { ## 非必填,请求配置
‘base_url’:’http://’,
‘headers’: {
‘Content-Type’: ‘application/json’}
}
}
2.3 test数据结构
{
‘name’: "test", ##必填,测试步骤名称
‘request’: { ## 必填,测试步骤request信息
‘method’: "POST",
'files': {},
'data': {},
'headers': {},
'url': 'http:// ',
'params': {},
‘json’: {},
}
'setup_hooks': [], ##前置操作
'teardown_hooks': [], ##后置操作
‘extract’: [ ##提取参数保存,以便后面测试步骤使用
{ 'uploadCode':'content.code'}
],
‘validate’: [ ## 对当前测试结果的校验
'string_equals': ['content.code','200']
],
}
}
03 测试平台对接HttpRunner3.1 通过UI实现测试用例的编写和运行
在测试平台中为了方便用户快速设计接口测试用例,将HttpRunner的用例结构方式实现了UI,后端再进行封装成JSON格式,交给HttpRunner进行执行。
另外,接口测试常常会涉及接口调用前准备工作和接口调用后验证工作,所以测试平台引入了HttpRunner高效的hook机制。前置和后置都实现了多数据源的操作以及灵活的自定义函数。后端将前置数据源实现以及自定义的函数都放到setup_hooks中,后置数据源实现以及自定义函数放到teardown_hooks中。同时后置数据源实现的函数形参都引用了接口返回response,然后将需要验证的数据源查询结果可以放到response,以便在断言中可以进行验证处理。
考虑到测试用例复用性,数据源查询支持参数化。对于普通参数,我们将该类参数格式规范成$parameter,进入hook机制前将SQL中的参数进行参数映射。对于接口返回值作为参数(只出现在后置数据源),我们将该类参数格式规范成{response.json[][]..},其中response作为teardown_hooks中函数形参,在函数中将字符串response.json[][]..转成对象即可拿到接口返回值,再执行相应的SQL语句。
断言是测试用例设计的关键所在,目前平台支持多种验证方式和多种数据类型,接口返回值验证,数据源查询结果验证,函数执行结果验证等验证方式,String,int,float,dict,NoneType等数据类型。
3.2优化测试结果排序,高亮报错用例
测试计划执行结束后会生成测试数据,对其进行重排序,将错误的测试用例前置高亮,这样就可以优先看到有问题的用例。测试报告是html形式,支持定制化。
引入HttpRunner框架后,我们在测试平台上已经接入了95%以上的接口测试需求,总计10000多个接口测试用例,平均每天接口用例执行次数达到1000以上。通过测试平台实现了测试计划、测试用例管理和测试用例执行以及测试报告一体化,非常有效地提升了整个团队的测试效率和质量。
对于未来,我们准备持续优化HttpRunner和测试平台的集成,支持更多种方式的测试用例编写和执行,引进数据驱动方式,实现参数化循环执行测试用例,其包括3种方式:
1、直接指定关联参数列表;
2、引用CSV文件定义关联参数;
3、引用自定义函数定义关联参数。