jmeter(4)响应断言 json断言 beanshell断言

参考博文:https://www.cnblogs.com/dinghanhua/p/9823627.html
https://blog.csdn.net/lijing742180/article/details/81157947

感谢博主!

一.响应断言

理解断言的作用,为什么要加断言?

在调试脚本时不加断言是无意义的,但是做性能测试时压测脚本不要带断言,影响性能。

因为业务返回结果是错的话,结果树请求样本显示绿色,不清楚是业务逻辑是否真的没问题,

所以加断言,如果业务失败的话,加断言后,结果树请求样本显示红色。

1. Apply to:指定断言作用范围

①Main sample and sub-samples:匹配范围包括当前主取样器和子取样器

②Main sample only:只作用于main sample,仅匹配当前主取样器,一般都是选择这个

③sub-samples only:只作用于sub-sample,仅匹配子取样器 

④JMeter Variable..:支持对JMeter变量值进行匹配,比如在测试计划配置一个变量

取样器----高级设置----勾选从HTML文件嵌入资源

主请求:查看结果数-主请求

子请求:查看结果数-主请求的下方都是子请求

小总结:

1Main sample and sub-sample:作用于主main sample和子sub-sample

如果选择这个了,断言需要将写的要求同时对主请求和子请求都去做断言。


2:断言失败的话,聚合报告异常是100%,会影响。

写操作:insert update delete性能角度避免加断言,那怎么判断?看界面数据。

断言的目的是加检查点,要有一定的成功率。
为什么压测的时候禁用查看结果树,而只用聚合报告?
因为查看结果树一直要记录请求与响应,一直占
jmeter的内存数据。要求输出东西越多,就会导致gc等问题。

注意点:

1、大多数情况下,可只勾选“main sample only”,因为一般情况下,发起一个请求,实际就只有一个请求。但是在某些情况下,发起一个请求时,会触发多个服务器请求,这时候就有main sample和sub-sample之分,类似ajax请求,另外,如果发起重定向请求,并且勾选“跟随重定向”, 则把重定向后的请求视为main-sample

2、如果sub-sample断言失败,但main sample断言成功,那么main sample也被设置为失败状态。如果作用域JMeter变量,且该变量关联main sample,那么如果断言失败,则main sample也被设置为失败(If the JMeter variable option is used, it is assumed to relate to the main sample, and any failure will be applied to the main sample only)。

3.如果执行完每个sampler的所有断言,变量JMeterThread.last_sample_ok会被设置为true或false

2. 测试字段:要测试的响应字段,指我们要进行断言的内容所在的位置,分为response和request两大块,最常用的是响应文本

①响应文本(Text Response) :从服务器返回的响应文本,比如body,不包括任何HTTP头信息;响应服务器返回的文本内容,最常使用

响应状态(Response Code) : 比如 200302301,比如返回代码“200”表示成功

响应消息(Response Message) : 比如处理成功返回 OK,比如处理成功返回“成功”字样

响应头(Response Headers)包括Set-Cookie 头,如果有的话。即匹配响应中的头信息,比如token值

请求头Resquest Header:请求中的头信息,比如sign值 

URL样本:通过Apache Tika追踪的各种各种类型文档的文本URL样本。比如是否重定向,改变了URL地址(不是很懂......)

文档(文本)Document(text):对文档内容进行匹配;会消耗内存,不推荐!

⑧忽略状态:指示JMeter设置sampler status的初始状态为success。sample status是否成功,由已Response status和断言结果决定,当选中Ignore Status时,Response status被强制设置为success,不执行进一步的断言判断。仅第一次断言时使用。

理解:会强制将jmeter最初的响应状态设置为成功,哪怕响应是404,505,也会强制视为成功。通过将断言的结果与现有的响应状态结合来确定取样器的总体成功。选中忽略状态复选框后,在评估断言之前,会强制响应状态成功。具有4XX和5XX范围内状态的HTTP响应通常被视为不成功。为了能够执行进一步检查,忽略状态复选框可用于设置状态成功。注意⚠️这将清除任何先前的断言失败,所以确保这个设置仅在第一个断言上设置此操作。

⑨请求数据Request Data:请求数据,请求体即body的数据信息

3. 模式匹配规则:如何根据不同的模式来检查要断言的文本?

一般用包括或者字符串

包括响应内容包括需要匹配的内容即代表响应成功,为true;包括某一些字段

②匹配:响应内容完全匹配需要匹配的内容即代表响应成功,为true,不区分大小写,支持正则;

③Equals(等于):如果整个文本等于模式字符串,响应内容要完全匹配文本内容才代表响应成功,为true,区分大小写。

匹配内容是是纯字符串匹配,字符串非正则表达式,即不支持正则。

Substring:是纯字符串匹配,如果文本包含模式字符串,响应内容包含需要匹配的内容才代表响应成功,为true,区分大小写。
匹配内容是是纯字符串匹配,字符串非正则表达式,即不支持正则。

⑤否或者:跟前面四个选项结合使用,分别用于逻辑取反、取或。

逻辑取或:

要测试的模式(Patterns to Test):测试模式:输入框,填入匹配的字符串或正则表达式,可以添加多个模式,可使用变量、文本、正则表达式(在“包括”和“匹配”模式下)。填写需要测试的模式列表(list of patterns)。 每个模式都单独测试,如果某个模式失败了,那将不会往下检查剩余的模式。添加一个断言,多个测试模式(通过重复点击面板的添加按钮来添加多个测试模式),和多个断言,每个断言一个模式是一样的

响应断言:

断言结果:成功只显示一行,错误时显示多行

断言有多种类型:断言持续时间,尺寸大小断言

二.json断言

当响应结果是json格式时,用JSON Assertion更方便判断。

1 在请求上右键添加json断言 

2  编辑json Assertion

判断方式:

如果响应结果不是json格式的,fail

如果json path找不到元素,fail

如果json path找到元素,没有设置条件,pass

如果json path找到元素了,不符合条件,fail

如果json path找到元素,且符合条件,pass

如果json path返回的是一个数组,迭代判断是否有元素符合条件,有则pass,无则fail

第一种  值匹配

a. 值匹配成功示例:

 $[*].TT

b.值匹配失败示例:

举例1:
实战写json断言:

返回结果1:

{
"data": [
{
"code": "001",
"name": "uuer",
"id": "694331c8"
}
],
"success": true,
"message": "success"
}

对响应结果的一级断言:

对响应结果的二级断言:

应该是 $[*].TT

返回结果2:

{
"data": [
{
"code": "001",
"name": "uuer",
"id": "694331c8"
}

{
"code": "002",
"name": "uuer",
"id": "694331c8"
}

{
"code": "003",
"name": "uuer",
"id": "694331c8"
}
],
"success": true,
"message": "success"
}

返回结果3:

{
"data": 
{
"operate": {

     "name":"haha",

     "pwd":"12345"

     }"001",
"name": "uuer",
"id": "694331c8"
}

$.data.operate.name   haha

json path espressions的语法学习

$:跟对象\元素

@:当前对象\元素

?():应用过滤器(脚本)表达式

复制代码
 1 { "store": {
 2     "book": [ 
 3       { "category": "reference",
 4         "author": "Nigel Rees",
 5         "title": "Sayings of the Century",
 6         "price": 8.95
 7       },
 8       { "category": "fiction",
 9         "author": "Evelyn Waugh",
10         "title": "Sword of Honour",
11         "price": 12.99
12       },
13       { "category": "fiction",
14         "author": "Herman Melville",
15         "title": "Moby Dick",
16         "isbn": "0-553-21311-3",
17         "price": 8.99
18       },
19       { "category": "fiction",
20         "author": "J. R. R. Tolkien",
21         "title": "The Lord of the Rings",
22         "isbn": "0-395-19395-8",
23         "price": 22.99
24       }
25     ],
26     "bicycle": {
27       "color": "red",
28       "price": 19.95
29     }
30   }
31 }
复制代码

$.store.book[*].author:商店所有书籍的作者(四个作者)

$..author :所有作者

$.store.* :商店所有的东西,包括book和bicycle

$.store..price :所有东西的价格

$..book[2] :第三本书

$..book[0,1] /$..book[:2] :前两本书

 $..book[?(@.isbn)] :用isbn编号过滤所有书籍

$..book[?(@.price<10)] :过滤所有比10更便宜的书

$..* :XML文档中的所有元素

第二种 正则匹配

a. 正则匹配成功示例:

 b. 正则匹配失败示例: 

断言fail,提示预期和实际结果不相符

第三种 预期为null

 第四种 反转,上面的不符合pass,上面的有符合的fail

断言提示有点怪怪的。 感觉 failed that  jsonpath $[0].TT matches 20181019 更好吧。因为匹配所以fail。

三.beanshell断言

原文地址:https://www.cnblogs.com/yiyaxuan/p/12256335.html