jmeter中,接口自动化的关键在于参数关联。比如需要登录的接口,如何调用登录口令?一个增删改查的闭环,如何将接口参数上下传递?下面就以实际的例子来仔细说一说
1:登录接口
这里有一个实际的登录接口,在响应中返回了一串token,如下图:
那么我们在接下来的首页-退回待处理中(无论测试这个系统中哪个接口,都需要带入token信息,否则就会报错),就必须带入这一串token,否则就会响应报错,如下图:
如何获取登录的口令呢?这里详细说明一下,如下图:
这里我们可以在线程组中添加一个调试取样器(debug sampler),检验正则表达式是否提取到我们想要提取的token值,如下图:
添加完调试取样器后,直接运行,看一下查看结果树响应数据中的返回值,如下图:
在接下来的接口中可以将获取的token作为变量调用(这里调用token,根据系统实际情况而定),我这里演示的token是在请求信息头中传参的,所以我这里需要在首页-退回待审核下添加一个HTTP信息头管理器进行传参,如下图:
这是通过谷歌F12获取到系统中的实际信息,如下图:
现在开始调用变量,变量名为${autho},如下图:
还有这样调用token的,我这里使用这种方法的是不适用的,根据具体情况,大家可以参考,如下图:
观察请求头,发现传入了一串token,并且响应结果正确,如下图:
自此,一个完整的同一线程组内的登录关联就结束了。后续接口如果都在同一个线程组内,直接调用该token就可以。
我们接下来继续说说跨线程组的token参数关联,如果我们进行接口测试或者是性能测试时,可能会存在不同模块使用多个线程组进行测试和维护的情况,这种时候使用之前那种方式直接获取token,运行以后会发现响应数据报错401,说明无登录授权。
这时候我们只要在之前提取token的基础上,再进行两步操作就可以获取登录权限了(学习是一个艰难且无聊的过程,但是坚持下来收获还是颇丰的,还在坚持的孩子们要加油啊!你们都棒棒的!!!)
第一步:在登录的http请求下添加后置处理器BeanShell PostProcessor(BeanShell后置处理程序)
在脚本中添加代码如下图:
String token = bsh.args[0];
print(token);
props.put("newtoken",token);
第二步:在测试计划下添加前置处理器BeanShell PreProcessor(BeanShell预处理程序)
在脚本中添加代码如下图:
//获取登录token
String newtoken =props.get("newtoken");
log.info(newtoken);
vars.put("newtoken",newtoken);
最后引用newtoken值,这里需要根据实际情况,传递参数,我这边是需要传到请求信息头中(还有直接在请求体中进行传参的),如下图:
最后看一下,运行一下jmeter,看token值有没有被成功获取
比如一个增删改查流程,想要做自动化检验就必须形成一个闭环,那么删除-修改-查看就必须调用同一个必填参数,例如唯一性的id。下面还是实例演示
我先新增一个界别,可以看到界别列表结果中返回了一个新增的数据id,在后续接口中都必须调用此唯一性的id,如下图:
接下来写一个正则将其取出,我要取的是第二个id,所以匹配数字填写了“2”,如下图:
运行一下程序,发现已经正确提取了我想要的id,如下图:
后续接口可以调用此参数(注意此处传参的具体格式应该以接口文档和抓包结果为准),并运行程序,查看结果,发现可以正确响应,如下图:
好了,一个完整的登录-新增-编辑-删除的流程到这里就可以结束了~下面是结尾彩蛋
上述的正则都是获取单个的参数,那么如果要传入一组参数要怎么写呢?
修改正则表达式
结果中可以看到传入了一整个数组
正则提取器核心用法: 它通过正则表达式获取接口响应,并传入下个接口
引用名称:定义一个变量,供后续请求引用
一般(.+?)和(.*?)能够满足我们80%的使用场景。所以,一般的
正则表达式都可以写成下面这2种
左边界(.+?)右边界
左边界(.*?)右边界
left对应匹配目标的起始字符
right对应匹配目标的结束字符
正则表达式:利用正则将需要的数据提取出来
() 括起来的部分就是需要提取的,对于你要提的内容需要用小括号括起来
. 点号表示匹配任何字符串
+ 一次或多次
? 在找到第一个匹配项后停止
模板:用$$引用起来,如果在正则表达式中有多个正则表达式(多个括号括起来),则可以是$N$等,表示提取第N个括号里面的值
匹配数字:-1代表提取所有值,此时提取结果是一个数组,其余正整数代表第几个匹配的内容被提取出来。如果匹配数字选择的是-1,后续可以通过${XXX_1}的方式来取第1个匹配的内容,${XXX_2}来取第2个匹配的内容。0表示随机匹配一个值
缺省值:正则匹配失败时取的值
例1:提取第一个Name
例2:提取全部Name
例3:表达式同时提取Name和population
例4:拆分身份证号码,提取生日
一个18位的身份证号码,前1-6位是地区,7-14位是生日,15-17位是顺序码,最后1位是校验码,试图通过正则从身份证号中提取地区和生日
正则表达式:
{"(.{6})(.{8})(.{3})"}
(.{6}):任意字符匹配6次,对应匹配结果中的前6位字符(地区)
(.{8}):任意字符匹配8次,对应匹配结果中的第7-14位字符(生日)
从身份证号码中取出地区和生日,对应的正则表达式为:
(.{6})(.{8})(.{3})(.)
匹配第二组→$2$
例5:条件判断取值
提取population=800的城市