Jmeter 断言
标签(空格分隔):Jmeter
通用界面规则
-
Name:名称
-
Comments: 注释
-
Apply to 作用域(必填)一般使用
Main sample only
即可- Main sample only - 仅适用于主要样本
- Sub-samples only - 仅适用于子样本
- Main sample and sub-samples - 使用与主样本和子样本
- JMeter Variable Name to use - 断言将应用于命名的内容
Response Assertion 响应断言
响应断言允许用户通过添加模式字符串来比较验证服务器返回的响应。 例如对响应返回的状态码进行验证,或是对响应返回的本文内容验证等等。
界面介绍
-
Apply to 作用域(必填)一般使用
Main sample only
即可- Main sample only - 仅适用于主要样本
- Sub-samples only - 仅适用于子样本
- Main sample and sub-samples - 使用与主样本和子样本
- JMeter Variable Name to use - 断言将应用于命名的内容
-
Field to Test 指定筛选的字段
- Text Response - 服务器响应文本,一般情况下,我们都是勾选改选项,用于验证服务器返回值。
- Request data - 请求的数据
- Response Code - 响应代码 (200, 500)
- Response Message - 响应信息 (OK)
- Request Headers - 请求头
- URL
- Document(text) 通过Apache Tika从各种的文档中提取的文本进行验证,包括响应文本,pdf、word等等各种格式。jmeter会用Apache Tika去解析服务器响应内容,耗内存、也耗时间,解析易失败,尽量少用或不用。多用响应文本方式来进行断言验证
-
Ignore status 忽略响应状态,勾选后即使返回的状态码为4xx 5xx,会强制将返回状态装为成功,然后进行断言操作。不勾则不进行断言。
-
Pattern Matching Rules 匹配规则
- Contains 包含 指返回结果包含要测试的模式中指定的内容,支持正则表达式
- Matches 匹配 (1)相当于equals。返回值是固定的,可以以返回值做断言,效果同equals;(2)正则表达式匹配。用正则表达式来匹配返回结果,但必须全部匹配。即正则表达式必须能匹配整个返回值,而不是返回部分值,注意与包括模式的区别(包括是支持模糊匹配的)
- Equals 等于 如果返回文本等于规则字符串,则返回true(区分大小写, 不支持正则表达式)
- Substring 如果返回文本包含在规则字符串,则返回true(区分大小写,不支持正则表达式)
- No 取反,如果上述的几种方法匹配成功了,取反后返回False
- Or 存在多个断言规则是使用,多个断言规则的情况下,一个断言成成功了断言就成功
-
Patterns to Test (必填) 测试模式,在列表里添加匹配的规则或则匹配的字段。每个模式都单独测试,如果某个模式失败了,那将不会往下检查剩余的模式
-
Custom failure message 自定义失败信息
实例1 Ignore status
- 勾选 Ignore status 接口请求服务器后会返回404。 返回的的是404 但是状态为成功,结果被强制转换
- 不勾选 Ignore status,接口请求服务器后会返回404。 返回的是404状态为失败。
实例2 断言返回文本-字符匹配 服务器返回的字符串为"hello world",断言规则为 Equals 等于
-
断言返回的文本是否等于 "hello"
断言规则 断言结果
-
断言返回的文本是否等于 "hello world" 断言规则 断言结果正确
实例3 断言返回文本-正则匹配 服务器返回的字符串为"mobile phone: 13718885333",断言规则为 Contains 包含
- 断言返回的字段中是否包含11位手机号 断言规则 断言结果成功
Size Assertion 包体大小断言
对返回的包体的大小进行断言
界面介绍
-
Response Size Field to Test 指定筛选字段
- Full Response - 整个响应包
- Response Headers - 响应头
- Response Body - 响应体
- Reponse Code - 响应状态吗
- Reponse Message - 响应信息
-
Size to Assert
- Size in bytes 用于测试响应包大小(或JMeter变量值)的字节数。
实例1 设置的包体大小为 12bytes, 实际大小为 350bytes
-
包体小于设置
断言规则 断言结果 -
包体大于设置
断言规则 断言结果
Duration Assertion 持续时间断言
对返回的持续时间进行断言,任何超过设定的持续时间就会被认定为失败 界面介绍
- Duration in Milliseconds(单位毫秒) 持续时间,请求返回的最大等待时间,如果超过该值,请求被标记为失败
实例 最大持续时间为2s,添加循环控制器,循环次数为20
-
持续时间设定
执行结果
JSON Assertion Json断言
对Json的格式的样本进行断言,如果样本返回的样本不是Json格式,会解析失败。 界面介绍
- Assert JSON Path exists - 断言的Json路径
- Additionally assert value - 如果需要对值进行断言,需要勾选
- Match as regular expression - 如果使用正则表达式,请勾选
- Expected Value - 匹配断言或则正则表达式
- Expect null - 期望为空,勾选
- Invert assertion (will fail if above conditions met) - 对断言结果进行反转
断言操作使用的数据
"nickName": "hello world kaka",
"userId": 123213,
"data": [
{"nickName": "www.baidu.com"},
{"nickName": "www.sina.com.cn"},
{"nickName": "www.163.com"},
],
"url": "http://www.sapprft.gov.cn",
实例1 对Json路径进行断言 断言Json一级路径的下的nickName
- 断言规则
- 断言结果
实例2 对Json路径的值进行断言 断言Json一级路径的下的nickName
是否为hello world
- 断言规则 需要勾选Additionally assert value 在 Expected Valuez 中填入hello world
- 返回结果为 hello world,断言结果正确
- 返回结果不是 hello world,断言结果失败
实例3 使用正则表达式对Json路径的值进行断言 正则表达是的匹配的内容是值的全部字段,不是部分字段。例如 返回内容为phone 110
是无法单独去匹配110的
- 断言规则 需要勾选Additionally assert value 需要勾选Match as regular expression 正则表达式
[a-z]+:\/\/[a-z0-9_\-\/.%]+
- 断言结果
BeanShell Assertion
允许用户使用BeanShell脚本执行断言检查。 界面介绍
-
Reset bsh.Interpreter before each call - 如果选择此选项,则将为每个样本重新创建解释器,对于某些长时间运行的脚本,这可能是必需的。有关详细信息,请参阅 bean shell 最佳实践在每次调用BeanShell之前重置bsh.interpreter类(bsh.interpreter是Bean Shell脚本语言的一种类,也可以理解为一种解析器)
-
Parameters 要传递给Bean shell参数,参数会保存到以下的变量中
- Parameters 包含参数作为单个变量的字符串
- bsh.args 包含参数的字符串数组,在空白处分割
-
Script file 需要运行的脚本文件,填写脚本文件名称后会覆盖要运行的脚本。
-
Script 要运行的脚本
Bean shell 部分语法
- log:可以利用该对象输出日志
- SampleResult, prev 从该类中可以获取响应数据,响应码等信息 ,只读。类传送门
- Response :获取响应数据,只读。
- Failure :用来设置断言成功与否。
- FailureMessage:用来设置失败信息。
- ResponseData:用来获取返回的数据。
- ResponseCode:获取响应码。
- ResponseMessage:获取响应信息
- ResponseHeaders :获取响应头信息
- RequestHeaders :获取请求头信息
- SampleLabel:取样器Lebal信息
- SamplerData:发送给服务器的数据
- ctx:Jmeter的上下文信息,从中可以获取线程数,线程号等信息类传送门
- vars:获取jmeter定义的变量,或则设置变量类传送门
- props:获取jmeter的属性,或则设置属性类传送门 ,jmeter属性
实例1通过传入的值进行断言 对传入的值进行断言,断言脚本中通过bsh.args
来获取传入的值, 例如传入的数据为"value1", "value2", bsh.args[0] 取到的值为"value1";
- 如果传入的值不是'hello',断言失败
String s1 = bsh.args[0]; //获取传入的值
log.info(s1);
if(s1 != "hello"){
Failure=true; //设置断言结果
FailureMessage = "s1 不是hello"; //自定义断言输出语句
}
断言结果
实例2 通过beanshell 通过返回值进行断言
import java.util.regex.*;
log.info("原生的ResponseData============================:"+ResponseData);
log.info("转换后的的ResponseData2========================:"+new String(ResponseData));
String reponseDataAsString = Response.getResponseDataAsString(); //Response 获取返回数据
String reponseDataAsString2 = SampleResult.getResponseDataAsString(); //SampleResult 获取返回数据
String reponseDataAsString3 = prev.getResponseDataAsString(); // 通过prev获取返回数据
log.info("reponseDataAsString============================:"+reponseDataAsString); //打印返回数据
log.info("reponseDataAsString2============================:"+reponseDataAsString2); //打印返回数据
log.info("reponseDataAsString3============================:"+reponseDataAsString3); //打印返回数据
log.info("isSuccessful=============================:"+Successful); //请求是否成功
log.info("ResponseCode=============================:"+ResponseCode); //响应码
log.info("ResponseMessage=============================:"+ResponseMessage); //响应信息
log.info("SampleLabel=============================:"+SampleLabel); //获取取样器的label的信息
log.info("SamplerData=============================:"+SamplerData); //获取发送给服务器的数据
log.info("ResponseHeaders============================"+ResponseHeaders); //获取响应头信息
log.info("ctx.getThreadNum========================="+ctx.getThreadNum()); // 获取线程号
log.info("ctx.getThread========================="+ctx.getThread()); // 获取线程
log.info("vars.get username============================="+vars.get("username")); // 通过获取变量
log.info("var.getThreadName() =========================="+vars.getThreadName()); //获取线程名称
vars.put("pass", "5678"); // 设置变量
log.info("vars.get pass============================="+vars.get("pass")); // 通过获取变量
log.info("props.getProperty.remote_hosts==========================="+props.getProperty("remote_hosts")); //获取远程地址
String pattern = "([a-z]+:\\/\\/[a-z0-9_\\\\-\\\\/.%]+)";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(reponseDataAsString);
if (m.find()) {
log.info(m.group(1));
}
else {
Failure=true; //设置断言结果
FailureMessage = "没有找到url"; //自定义断言输出语句
}
断言结果