1、需求场景
事情是这样的,测试某个需求经常要用到新账号,需要注册,问题来了:
1、如果每次都手动去前台注册,效率太低了…
2、关联表比较多,直接数据库插入也不可行…
3、其实可以用Python来实现,但需要从头开始写代码…
…
n、想着Postman已经有调试过的现成的注册流程接口,何不在Postman中用runner来批量执行注册相关的接口,实现自动注册,似乎这个方法是目前最快捷的了,话不多说,打开Postman就是一顿猛操做
2、需求分析
先来分析一下需要批量执行的接口有哪些:
注册流程相关的api有2个,分别是:
- 发送验证码api
- 注册api
要想实现自动化,就得需要Postman连接数据库查询相关的数据来替代手工操作,涉及到查询和更新数据库的api有3个,分别是:
- 查询手机号api(查询手机号是否存在于数据库user表中,即是否已注册过)
- 更新手机号api(如果手机号已注册,则更新wow_user表中指定id的mobile字段值,即让该手机号变为未注册过)
- 查询验证码api(发送验证码后,查询数据库member_find表mobile字段值为手机号的数据,即手机号收到的验证码)
整个操作流程下来总共有5个api请求,他们的顺序和关系如下图:
ps:Postman可以通过Xmysql工具生成的API对数据库进行查询和更新,之前写过相关的文章,有兴趣的可以去看看【使用Xmysql实现Postman连接数据库,进行数据的查询和更新】,此处不再赘述,本文主要是写写Postman工具中,通过JS脚本来控制接口之间的执行顺序问题。
从以上流程图可以看出,有两条分支可以走,走那条分支取决于当前手机号是否已注册过,所以我们可以在【查询手机号】这个api请求后,添加后置JS脚本,用于判断手机号是否已注册,进而控制接下来该执行哪个分支的接口。
3、需求实现
将整个自动注册流程下来总共有5个api请求调试好,接口名称如下:
【敲重点】!!!
Postman中有个沙箱环境,里面有很多内置的测试脚本,都是比较基础的,一般用于各种断言;获取响应内容的某个字段将其设置为环境变量,作为下一个接口的入参;等等
本次还需要实现的:控制在runner运行时接口执行的顺序 ,在内置脚本中是没有的。
当runner集合中包含多个请求运行时,postman会默认按照线性顺序来执行这些接口请求的,如果想要改变接口的执行顺序,需执行setNextRequest相关命令
操作方法:
(1)在前置脚本Pre-request Script或后置脚本Tests中指定
(2)指定后续请求的名称
(3)具体的脚本是:postman.setNextRequest(“接口名称”)
postman.setNextRequest("接口名称");
下面是在【查询手机号】api请求的后置脚本Tests中需要写上的完整的JS脚本
//获取到json返回的内容
responseData = JSON.parse(responseBody)
//判断当前手机号是否被注册 ,响应内容如果为空说明手机号未注册,不为空,则已注册
if(responseData == 0){
tests["当前手机号为未注册账号"] = true === true;
//当前手机号未注册则执行正常手机号注册流程
postman.setNextRequest("发送验证码");
}
else{
tests["当前手机号已经注册"] = true === true;
//将id复制给user_id
var user_id = responseData[0].id;
//设置user_id为环境变量
pm.environment.set("user_id",user_id);
//当前手机号已注册则执行更新手机号的接口,使手机号变为未注册
postman.setNextRequest("更新手机号");
}
完成调试后,点击runner运行器,选择上图中的文件夹“自动注册流程”,确定运行即可完成自动注册
下图是走的手机号未注册的分支的执行结果:
下图是走的手机号已注册的分支的执行结果:
4、踩过的坑
因对JS脚本并不是很熟悉,在写的过程中遇到了问题,最开始写的条件判断语句是下面这样的时候,报错了:
从上述错误猜测,条件判断if后面的语句并没有执行,而是执行else后面的语句了,明明响应内容为空,为什么没有执行if后面的语句呢?
原来在JS中,[]==[]执行结果是false,并不是true,而[]==0的执行结果却是true
知道问题原因就好办了,只需要把if判断语句改一下,即判断响应内容是否等于0即可
即:
将if(responseData == []) 改成
if(responseData == 0) 或
if(responseData.length == 0)