每周读书与学习是由清华大学出版社出版的《JMeter核心技术、性能测试与性能分析》一书的作者推出,分享作者多年的IT从业经历,希望对很多计算机科学技术IT类专业毕业生以及IT从业者有所帮助。
1、后置处理器
在Jmeter中,后置处理器通常用于在实际取样器(Sampler)发出请求之后对请求的响应结果进行后置处理,如下图所示,后置处理器通常会在取样器之后执行,比如通过HTTP取样器发送了一个HTTP请求后,需要对HTTP请求返回的结果做一些处理,比如从结果信息中提取返回的状态码以判断请求是否执行成功等。
从图中可以看到,后置处理器通常主要包括:
- CSS/JQuery提取器:通过使用CSS/JQuery选择器语法从服务器的HTML响应中提取出需要的数据,当响应结果为一个HTML形式的结果时,可以用该提取器来获取指定的数据。
- JSON提取器:通过使用JSON-PATH语法从服务器的JSON响应结果中提取出需要的数据,只有当响应的结果为JSON格式时,才可以考虑使用JSON断言,JSON断言时需要指定JSONPath(即JSON路径),然后Jmeter会根据对应的路径到返回的JSON数据中去获取对应路径下的数据值。
如下所示,是一个JSON数据示例,通过指定不同的JSON路径,即可获取到不同的数据,如下表所示列举了常见的不同的JSON路径获取数据的示例。
|--------------------------------------------|-------------------------------------------|
| .store.book\[\*\].author | 获取JSON中store.book路径下的所有的author |
| ..author | 获取所有的author |
| .store.\* | 获取JSON下的store路径下的所有数据 |
| .store..price | 获取JSON下的store路径下的所有price数据 |
| ..book\[2\] | 获取JSON数据中的第三次出现的book数据 |
| ..book[-2] | 获取JSON数据中的倒数第二次出现的book数据 |
| ..book\[0,1\] | 获取JSON数据中的第一次和第二次出现的book数据 |
| ..book[:2] | 获取JSON数据中从索引0(包含索引0)到索引2(不包含索引2)的所有book数据 |
| ..book\[1:2\] | 获取JSON数据中从索引1(包含索引1)到索引2(不包含索引2)的所有book数据 |
| ..book[-2:] | 获取JSON数据中最后出现的两次book数据 |
| ..book\[2:\] | 获取JSON数据中从索引2(包含索引2)之后的所有book数据 |
| ..book[?(@.isbn)] | 获取JSON数据中带有isbn的所有数据 |
| .store.book\[?(@.price \< 10)\] | 获取JSON数据中所有price低于10的book数据 |
| ..book[?(@.price <= \['expensive'\])\] | 获取JSON数据中所有price低于expensive的book数据 |
| ..book[?(@.author =~ /.*REES/i)] | 获取JSON数据中所有符合正则表达式的book数据(忽略大小写) |
| ..\* | 获取JSON数据中的所有数据 |
| ..book.length() | 获取JSON数据中book的数量 |
{
"store": {
"book": [
{
"category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
},
{
"category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
},
{
"category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99
},
{
"category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
},
"expensive": 10
}
关于JSON Path的更多介绍,可以参考网址:https://github.com/json-path/JsonPath?tab=readme-ov-file#path-examples
- JSON JMESPath Extractor:通过使用JMESPath查询语言从JSON响应结果中提取出需要的数据,JMESPath查询语言比JSON-PATH语法更加的强大,关于JMESPath的更多详细介绍,可以参考官网网址https://jmespath.org/,在该网站中有详细介绍JMESPath的使用方式,如下图所示。
而且在官网链接https://jmespath.org/tutorial.html 页面中,提供了大量的从JSON中提取数据的语法示例,如下图所示。
如下所示,是一个JSON数据的简单示例,比如通过JMESPath查询语言people[*].first即可获取people这个List下的所有first的值,获取到的结果为["James","Jacob","Jayden"]。
{
"people": [
{"first": "James", "last": "d"},
{"first": "Jacob", "last": "e"},
{"first": "Jayden", "last": "f"},
{"missing": "different"}
],
"foo": {"bar": "baz"}
}
-
边界提取器:通过设置左右边界的方式从响应结果的字符串中提取出需要的数据,如下图所示。
-
正则表达式提取器:通过适用正则表达式的方式从取样器返回的响应结果中提取出需要的数据。
-
JSR223 PostProcessor:通过使用符合JSR223规范的脚本语言来对取样器返回的响应结果做处理,JSR223是Java Specification Request 223的简写,是一个Java语言平台发布的规范,用于提供一种标准化的方式来嵌入脚本语言到Java应用程序中。
-
Debug PostProcessor:用于通过Debug调试的方式来输出取样器响应中的Jmeter属性、Jmeter变量、取样器属性、系统属性,以方便性能脚本的调试和问题定位。
-
JDBC PostProcessor:通常指通过使用 JDBC传输协议的方式在取样器运行结束后向数据库(必须是支持JDBC协议的数据库)发起查询、修改、删除等请求,该后置处理器通常需要与配置元件中的JDBC Connection Configuration元件一起搭配使用,需要在Connection Configuration元件中设置JDBC数据服务器的相关连接等配置信息,比如每次在取样器运行结束后,需要对数据库中的数据进行删除、修改等操作,即可使用该后置处理器。
-
结果状态处理器:通常用于在取样器发生错误时,用于控制Jmeter后续要如何执行接下来的动作,如下图所示,从图中可以看到在取样器发生错误时,该后置处理器提供的后续动作控制包括:
- 继续执行:表示不受任何影响,继续往下运行。
- Break Current Loop:仅仅停止当前在执行的这次线程循环,一个Loop表示一次性能测试脚本的运行,会把所有的相关的Jmeter元件都执行一次。
- 启动下一进程循环:表示直接进入Jmeter 进程的下一次执行。
- Go to the next iteration of Current Loop:直接当前线程循环的下一次迭代执行。
- 停止测试:待当前所有线程的当前循环运行结束后,停止整个性能测试。
- 立即停止测试:不做任何等待,直接立即停止测试。
- 停止线程:停止当前执行报错的线程,但是其他的线程还会继续运行。
-
Xpath提取器:通过使用XPath查询语言输入Xpath路径从取样器的响应结果中提取需要的数据,Xpath提取器通常适用于当响应的结果为XML或者HTML格式的返回,因为通常只有XML或者HTML格式才适用于Xpath查询语音,Xpath 是一种很重要的查询语言,在做前端页面的自动化测试时,也会经常用到Xpath语言,关于Xpath的详细介绍,可以参考网址:https://www.w3.org/TR/xpath-31/#id-introduction ,在该网站中,详细的介绍了Xpath语言的发展以及如何取进行使用。另外在很多常见的浏览器中,也支持了Xpath的提取,比如通过Google 浏览器打开https://www.baidu.com/ 网址,并且此时通过键盘的F12键打开Google 浏览器的开发工具(DevTools),选中需要提取的HTML内容,然后鼠标右键Copy Xpath 即可获取到该HTML内容对应的Xpath路径为/html/head/meta[5],如下图所示。
-
Xpath2 Extractor:与Xpath提取器类似,Xpath2 Extractor通过使用XPath2查询语言从取样器的响应结果中提取需要的数据,通常也是适用于当响应的结果为XML或者HTML格式的返回,关于Xpath2的更多详细功能介绍,可以参考网址https://saxon.sourceforge.net/saxon7.9.1/functions.html,如下图所示。
-
BeanShell PostProcessor:即BeanShell 后置处理程序,通过使用BeanShell脚本语言来对取样器返回的响应结果做处理,这种方式通常适用于需要完全对响应结果做自定义的处理,BeanShell PostProcessor非常的灵活,可以对结果内容做更多定制化的处理,但是需要一定的脚本语言的编程基础。
2、断言
在Jmeter中,断言通常用于对取样器返回的响应结果做检查以判断返回的响应结果是否正确,用于判断某次性能测试的结果是否通过,如下图所示。
从图中可以看到,断言通常主要包括:
-
响应断言:直接对取样器返回的响应结果做比较和判断,响应断言中可以被断言的内容包括响应文本、响应代码、响应信息、响应头(比如HTTP响应的 Header)、请求头(比如HTTP请求的Header)、URL样本、文档(文本)、忽略状态、请求数据(比如HTTP的请求Body)等,判断的规则通常有包括、匹配、相等、字符串、否、或者等,如下图所示,响应断言是Jmeter中用的最多的一种断言方式,大部分的性能测试都可以通过响应断言来完成对响应的结果的断言判断,在测试模式中,可以添加多个待判断的预期内容,并且在断言失败时,还可以自定义需要输出的失败消息。
-
JSON断言:通过对取样器返回的JSON响应报文结果进行解析来获取指定的数据从而来断言返回的结果是否正确,只有当响应的结果为JSON格式时,才可以考虑使用JSON断言,JSON断言时需要指定JSONPath(即JSON路径),然后Jmeter会根据对应的路径到返回的JSON数据中去获取对应路径下的数据值,关于JSONPath的使用可以参考3.7章节中的相关介绍[YZ1] ,因为在后置处理器中,也用到了JSONPath这种处理方式。
-
JSON JMESPath Assertion:和JSON断言很类似,通过JMESPath对取样器返回的JSON响应报文结果进行解析从而获取到对应的数据,并且对该数据进行断言是否符合指定的预期结果值,和JSON断言不同的是从JSON数据中获取数据的方式不一样,JSON断言采用的是JSONPath,而JSON JMESPath Assertion采用的是JMESPath
-
JSR223 Assertion: 指的是使用JSR223规范(全称为Java Specification Request 223,是一个Java语言平台发布的规范,用于提供一种标准化的方式来嵌入脚本语言到Java应用程序中)的脚本语言来自定义定制断言来判断取样器返回的响应结果是否符合指定的预期结果值。
-
大小断言:大小断言是指通过判断取样器返回的响应结果的字节大小来进行断言,比如判断字节数大于多少或者小于多少等来判断本次取样器返回的结果是否正确。
-
XPATH断言:通过Xpath查询语言来查询出取样器返回的响应结果中数据来断言取样器返回的结果是否正确,当返回的响应结果为HTML或者XML等格式时,就可以采用Xpath来查找指定的数据
-
Xpath2 Assertion:和XPATH断言很类似,通过Xpath2查询语言来查询出取样器返回的响应结果中数据来断言取样器返回的结果是否正确。
-
Compare Assertion:通过比较某个范围内的取样器返回的响应结果来断言本次取样器返回的结果是否正确,在高并发用户的性能测试中通常不推荐使用,因为会消耗大量的CPU、内存等硬件资源。
-
断言持续时间:通过判断取样器返回结果的响应时长是否在指定的时间范围内来断言取样器返回的结果是否正确,当超过指定的时长(单位为毫秒)的响应结果都会直接标记为失败。
-
HTML断言:通过使用Jtidy来检查取样器的响应结果数据中的HTML/XHTML/XML语法是否符合指定的预期来判断取样器返回的结果是否正确,JTidy 是一个HTML语法检查器,可以自动清除HTML文件中的错误和格式问题。
-
MD5Hex断言:通过对取样器返回的响应结果数据来生成MD5Hex数据,并对生成的MD5Hex数据进行断言以判断取样器返回的结果数据是否正确。
-
SMIME断言:该断言主要用于对邮件阅读者取样器获取到的邮件数据进行验证其mime消息的正文是否已签名,在验证签名时,支持指定自定义的签名者证书,另外需要注意的是使用邮件阅读者取样器时需要选择使用MIME存储邮件,否则该断言无法正确处理收到的邮件数据。
-
XML断言:通过判断取样器返回的响应结果数据是否为正确的XML格式来进行断言以判断取样器执行的返回结果是否正确。
-
XML Schema断言:通过对取样器返回的XML响应结果数据提取XML Schema来判断是否和指定的XML Schema一致来断言取样器执行的返回结果是否正确。
-
BeanShell断言:指的是使用 BeanShell脚本语言来自定义定制断言判断逻辑来判断取样器返回的响应结果是否符合指定的预期结果值。
3、本次学习总结
- 后置处理器的使用,包括CSS/JQuery提取器、JSON提取器、JSON JMESPath Extractor、边界提取器、正则表达式提取器、JSR223 PostProcessor、Debug PostProcessor、JDBC PostProcessor、结果状态处理器、Xpath提取器、Xpath2 Extractor、BeanShell PostProcessor等,在Jmeter性能测试中,后置处理器通常比前置处理器使用的更加频繁,建议读者重点掌握JSON提取器、边界提取器、正则表达式提取器、JDBC PostProcessor、Xpath提取器的使用。
- 断言的使用,包括响应断言、JSON断言、JSON JMESPath Assertion、JSR223 Assertion、大小断言、XPATH断言、Xpath2 Assertion、Compare Assertion、断言持续时间、HTML断言、MD5Hex断言、SMIME断言、XML断言、XML Schema断言、BeanShell断言等,断言通常也是Jmeter性能测试中不可缺少的元件,因为断言会用于验证性能测试的结果是否正确,建议读者需要重点掌握响应断言、JSON断言、XPATH断言、XML断言的使用。
出处 :本次学习的内容参考自清华大学出版社出版的《JMeter核心技术、性能测试与性能分析》一书