Jmeter 断言

 

标签(空格分隔):Jmeter


通用界面规则

image_1cso8f2sg19gdmg9ksc13ar1dgmb4.png-11.9kB

  • 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 响应断言

响应断言允许用户通过添加模式字符串来比较验证服务器返回的响应。 例如对响应返回的状态码进行验证,或是对响应返回的本文内容验证等等。

image_1csnvemeq1vld4dsj6po0v1n3l9.png-56.8kB

界面介绍

  • 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 但是状态为成功,结果被强制转换 image_1cso49nrh21k1tt11det1lol18br13.png-46.8kB
  • 不勾选 Ignore status,接口请求服务器后会返回404。 返回的是404状态为失败。 image_1cso4cbcr1t5a90vgl21tsb1e3r1g.png-51.7kB

实例2 断言返回文本-字符匹配 服务器返回的字符串为"hello world",断言规则为 Equals 等于

  • 断言返回的文本是否等于 "hello"

    断言规则 image_1cso56oup1kvf1dk81m5thur1vdq1t.png-13.7kB断言结果 image_1cso5d74n146e17qh28i1vcg176c6n.png-4kB

  • 断言返回的文本是否等于 "hello world" 断言规则 image_1cso5g26bcj723dulj1st82iv7k.png-5.7kB 断言结果正确

实例3 断言返回文本-正则匹配 服务器返回的字符串为"mobile phone: 13718885333",断言规则为 Contains 包含

  • 断言返回的字段中是否包含11位手机号 断言规则 image_1cso79uvmc697l8acs14bm5kkaa.png-2kB 断言结果成功 image_1cso7ch0o13qj1bfph6qoc9sefan.png-11.5kB

Size Assertion 包体大小断言

对返回的包体的大小进行断言

界面介绍 image_1csoapujkfc660r1jk61bl21l6qg5.png-36.4kB

  • 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

  • 包体小于设置
    断言规则 image_1cso9ng8uhg1v0eda6ahl1brde1.png-14kB断言结果 image_1cso9p24j1bj416kf1uep8hhmuaee.png-28.6kB

  • 包体大于设置
    断言规则 image_1cso9q8tb1phqa6o1n16jfuctler.png-14.4kB 断言结果 image_1cso9sm3rqrhmpb3091enj1idofo.png-36kB

Duration Assertion 持续时间断言

对返回的持续时间进行断言,任何超过设定的持续时间就会被认定为失败 界面介绍 image_1csoat1vr1aum1iosotsul91gegv.png-19.1kB

  • Duration in Milliseconds(单位毫秒) 持续时间,请求返回的最大等待时间,如果超过该值,请求被标记为失败

实例 最大持续时间为2s,添加循环控制器,循环次数为20

  • 持续时间设定

    image_1csob7uskgrf10r71cme14oo1tc0hc.png-20kB 执行结果 image_1csobi1um1nl01goe9th1adohvqhp.png-120.2kB

JSON Assertion Json断言

对Json的格式的样本进行断言,如果样本返回的样本不是Json格式,会解析失败。 界面介绍 image_1csq286rj6t71f2q14i6u2i13f89.png-26.3kB

  • 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

  • 断言规则 image_1csq3qef51a85jou837f61ngu22.png-26.3kB
  • 断言结果 image_1csq3rhpi12001etj162io0eqf2f.png-3.4kB

实例2 对Json路径的值进行断言 断言Json一级路径的下的nickName 是否为hello world

  • 断言规则 需要勾选Additionally assert value 在 Expected Valuez 中填入hello world image_1csq3qef51a85jou837f61ngu22.png-26.3kB
  • 返回结果为 hello world,断言结果正确 image_1csq435nv1lsk175v1jr01j6chp32s.png-1.7kB
  • 返回结果不是 hello world,断言结果失败 image_1csq4cisa1i2m1tvc137ihkv1u8o3p.png-5.9kB

实例3 使用正则表达式对Json路径的值进行断言 正则表达是的匹配的内容是值的全部字段,不是部分字段。例如 返回内容为phone 110 是无法单独去匹配110的

  • 断言规则 需要勾选Additionally assert value 需要勾选Match as regular expression 正则表达式[a-z]+://[a-z0-9_-/.%]+ image_1csq5jgs51u1551jaktgo5dev46.png-31.2kB
  • 断言结果 image_1csq5kv60l0b1ap714ie19o87dg4j.png-2.8kB

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"; //自定义断言输出语句
}

image_1csrg8og61nvhtmuire17fn1haf9.png-57.7kB 断言结果 image_1csrggp7ser8fho7381deduik1p.png-14.7kB

实例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"; //自定义断言输出语句
} 

断言结果 image_1csvnv7ftjd711sc16s5ljg1rn89.png-7.7kB

原文地址:https://www.cnblogs.com/summerxye/p/11004473.html