常用的jmeter断言有json断言、正则表达式断言、beanshell断言
1、json断言
json断言一般用于返回体内容为json格式的接口,以访问我的博客为例:https://blog.csdn.net/community/home-api/v1/get-business-list?page=1&size=20&businessType=blog&orderby=&noMore=false&year=&month=&username=weixin_43877527
填写请求信息:
右键该请求添加,断言,添加json断言:
表达式的语法就是用$符号和 . 一直往json里面取数据
断言成功:
断言失败:
也可以添加多个断言,失败一个即请求断言失败
2、响应断言
右键添加,断言,响应断言
这个信息会比json断言的多一点,,
Main sample and sub-samples - 主样器或子样器
Main sample only - 主样器
Sub-samples only - 子样器
Jmeter Variable Name to use - 要使用的变量名
一般我们是默认Main sample only
要测试的响应字段 - 一般用最多的是:响应文本、响应头(Response headers)、请求头(request header)
模式匹配规则:这个字面意思可以理解
我们选取一个信息来断言:即判断响应的文本里面是否包含字符串"code":200
断言成功:
断言失败的表现跟上述json断言失败是一样的
3、BeanShell断言
beanshell断言就属于脚本断言了,跟postman里面的脚本断言类似,脚本语法跟java类似,熟悉java语法的同学可以快速应对,可见我专栏java了解 java专栏
选中“取样器”右键 —> 添加 —> 断言 —> BeanShell断言
解释如下:
- 名称:BeanShell断言组件的自定义名称。
- 注释:即添加一些备注信息,对该BeanShell断言组件的简短说明,以便后期回顾时查看。Reset bsh.Interpreter before each
- call:每个BeanShell测试元素都有自己的解释器副本(对于每个线程)。如果重复调用测试元素,例如在循环内,除非选择在每次调用之前重置bsh.Interpreter选项,否则解释器将保留在调用之间。一些长时间运行的测试可能会导致解释器使用大量内存。由于BeanShell的bsh.Interpreter存在内存泄露,常规方法无法支持长时间的压力测试。JMeter官网推荐,在使用BeanShell进行长时间测试时,打开选项Resetbsh.Interpreterbefore eachcall,则在每次调用BeanShell程序前,都把解释器重置,以释放解释器之前占用的内存。
- 参数 (-> String Parameters和String[]bsh.args):输入String参数。String[]bsh.args是主类main函数的形式参数,是一个String 对象数组,可以用来获取命令行用户输入进去的参数。
- 脚本文件:脚本文件(可以填入脚本文件路径),可以点击后边的浏览选择脚本文件。
- Script (see below for variables that aredefined):编写脚本,参照下文定义的变量(使脚本文件参照定义的变量来运行)
脚本框下面会提示:
为脚本定义了下列变量:
Read/Write: Failure, FailureMessage, SampleResult, vars, props, log.
ReadOnly: Response[Data|Code|Message|Headers], RequestHeaders, SampleLabel, SamplerData, ctx
这里用一个脚本来实例:
// 获取响应体的文本
String response = prev.getResponseDataAsString();
// 设置期望值
String expect1 = "\"code\":500";
// 如果符合条件则失败为false,即断言成功了
if (response.contains(expect1)){
Failure = false;
}
// 否则断言失败
else{
Failure = true;
// 断言信息会显示
FailureMessage = "响应码为:" + prev.getResponseCode() + "\n"+"响应内容为:" + prev.getResponseDataAsString();
}
脚本的意思就是获取响应体的文本,然后判断是否包含某个文本
断言成功:
上述脚本有两个对象Failure, FailureMessage,一个用来表示断言成功与否(true或者false),一个用来自定义断言失败的信息提示,其实beanshell脚本里面还有一些其他的东西
Beanshell有一些默认的内置变量和方法,用户可以通过这些变量与JMeter进行交互,
- prInt:非GUI模式下打印信息(输出信息到stdout,标准输出控制台)。
- log:输出信息到日志(文件)
log.debu(“调试信息”)
log.info(“响应状态码” + ResponseCode)
log.warn(“警告信息”)
log.error(“出错信息”)
- ResponseCode:响应状态码(String类型)
- ResponseHeaders:响应头(String类型)
- prev:获取当前请求结果
prew.getResponseDataAsString():获取响应体数据(String类型)。
prew.getResponseCode():获取状态码(同ResponseCode,String类型)。
- vars:操作JMeter变量
String var1 = vars.get(“变量名”):获取变量的值(假设为String类型)。
vars.put(“变量名”, 变量值):设置变量值。
- props:操作JMeter属性
props.get(String,String) 可以获取JMeter中已经生成的属性。
props.put(String,String)可以创建和更新JMeter属性。
- ctx:获取当前线程上下文数据(可获取所有信息)
ctx.getVariables(“变量名”):获取变量值(同vars.get())。
ctx.setVariables(“变量名”, “变量值”):设置变量(同vars.put())。
ctx.getProperties(“属性名”):获取属性值(同props.get())。
ctx.setProperties(“属性名”,“属性值”):设置属性(同props.put())。
ctx.getPreviousResult():获取当前请求结果同(prev)。
ctx.getCurrentSampler():获取当前采样器。
ctx.getPreviousSampler():获取前一个采样器。
ctx.getThreadNum():获取线程数。
ctx.getThreadGroup():获取线程组。
ctx. getThread():获取当前线程。
ctx.getEngine():获取引擎。
ctx.isSamplingStarted():判断采样器是否启动。
ctx.isRecording():判断是否开启录制。
ctx.getSamplerContext():获取采样器上下文数据。
4、总结
常用断言有json断言、响应断言、beanshell,前两个使用比较方便容易,后一个需要一定的java语法能力,实际应用中灵活选取断言方式