最近在使用一款开源的接口自动化测试平台metershpere,虽经过一段时间的使用,给大家分享一些经验总结:
1. 接口测试如何入手?
1.1 变量:
在metershpere中存在3种变量:全局变量,场景变量和步骤输出变量
全局变量:定义在项目环境中,如果名称和后面两种冲突时优先级最低,优先级最高的是步骤输出变量,但是作用域最广,适用整个项目。
场景变量:在定义场景时可以定义场景变量,如下图,作用域限于场景以及引用场景的地方
步骤输出变量:在步骤后置操作中输出,只有后面的步骤可以适用此变量。
变量引用:以上三种变量的引用方式都是一样的,一般有两种方式:
【1】在消息体中 "${myVar}"
【2】在脚本中 String myData = vars.get("myVar");
这样使用也存在一个弊端,如果一个新人在脚本看到变量引用很难分清这个变量来自哪里,到底是全局变量,还是场景变量,还是脚本输出变量,关于这点上觉得metershpere需要优化一下,特别如果是场景变量,新手很难找到。如果想定义变量到底在哪边定义的,建议先到全局变量中搜寻,如果搜寻不到,再到前面步骤的后置条件中查找,可以多找几个步骤,如果还是找不到,那一定就是某个场景中定义的场景变量了。
关于接口测试,在metershpere平台中存在两种概念,接口定义和接口自动化
1.2 接口定义:分为API和CASE两种形式
[1] API:支持4种请求协议,HTTP、TCP、SQL和DUBBO,我参与的项目只用到了HTTP和SQL两种协议
如果是页面请求,就选择HTTP进行接口定义,如果是操作数据库就选择SQL
[2] CASE: 与上面API形式的区别就是可以设置断言和前后置操作另外可以作为单接口用例被场景用例复制和引用。
1.3 接口自动化
接口自动化就对应为场景用例,场景用例中可以复制/引用 上面API(只有复制形式)、CASE和其他场景用例。创建方式见下图:
点击右下角“+”
此处选项就不再介绍,说明文档里面是有的。
有了接口定义和场景定义的方式基本就满足了我们对普通web应用接口测试的需求。
1.4 测试计划
在创建完接口用例和场景用例之后,我们就可以创建测试计划
路径:测试跟踪==》测试计划
点击创建测试计划==》填写必填项==》点击规划&执行
接口测试用例==》场景用例==》关联测试用例==》选择需要关联的测试场景组成测试计划
点击测试计划后面...可以进入测试计划定时任务配置界面,同时可以设置webhook接受定时任务执行结果。
以上就是一个接口测试完整的流程。
但是在真正实现时会遇到很多问题,整理分享如下:
2. 问题分享
1. 如何获取linux时间戳,精确到毫秒?
${__time()}
2. 如何获取linux时间戳,精确到秒?
${__time(/1000,)}
3. 如何获取7天前的日期?
${__timeShift("yyyy-MM-dd", ,P-7D,,)}
4. 场景:我们需要通过一个http请求runTask来执行一个任务,但是接下来的步骤要等到这个任务执行状态变为成功才能继续执行,这个任务在服务端是异步执行的,我们需要调用另外一个getStatus接口来循环等待直到getStatus接口返回状态为成功。如果任务的类型有多种,通过一个taskId参数来控制,那我们的等待接口其实就可以封装成一个通用场景来重复使用,只需要修改taskId参数即可等待不同的任务结果了。如下图
这时有三点需要注意:
【1】我们要以复制的形式引入等待场景,因为我们需要等待不同的任务执行结果,就需要修改taskId。
【2】taskId 在右边红框“查看场景变量”中进行设置
【3】修改过taskId后还需要点击右边红框进入场景设置,勾选第3项,才能正常使用每个重新赋值的taskId。
5. 在有些时候对于测试接口返回400的http code就是我们的期待结果,但是metershpere总是把结果判断为error,要如何解决:
断言中选择正则方式,将忽略状态勾选中即可。还有一些关于数据库和脚本中http请求的问题,在其他文章中都有分享,在此就不再赘述。
以上是我使用metershpere时个人总结,希望对大家有所帮助,也希望使用过的同学能给出自己的一些问题解决办法,共同讨论,相互学习。