浅谈提取器中的要检查的响应字段
在Apache JMeter中,“提取器”(通常指的是正则表达式提取器、JSON路径提取器或CSS/JQuery提取器等)是用来从服务器响应中提取信息的重要组件。这些信息可以是cookies、session IDs、特定的文本或者任何你需要在后续请求中复用的数据。"要检查的响应字段"是配置这些提取器时的关键设置,它们决定了JMeter如何处理和解析响应数据。
要检查的响应字段
在设置正则表达式提取器时,“要检查的响应字段”是一个关键配置项,它指定了你想要从中提取数据的响应部分。JMeter提供了以下几个选项:
- 主体:从HTTP响应的主体内容中提取数据。对于大多数情况,比如提取网页中的某个值或者API响应中的数据,都会选择此选项。
- Body(unescaped):。所有html转义字符都被替换后的响应消息体。但是jmeter不会根据上下文处理html转义字符,所以有可能被不正确的替换,并且该选项很影响性能,所以在绝对必要并且知道其影响的情况下使用。
- Body as a Document:从各种类型的文档中提取文本,该选项很影响性能
- 信息头:如果你需要从响应头中提取数据,比如Cookie或特定的响应头字段,应选择此选项。
- Request Headers:请求的信息头中获取数据。
- URL:是对sample的url进行匹配,也就是查看结果树中请求内容的第一行url,不包含data里的请求参数
- 响应代码:仅提取HTTP响应状态码。
- 响应消息:提取HTTP响应状态消息,如"OK"、"Not Found"等。
实例说明
我们使用SpringBoot框架编写如下测试代码:
@GetMapping(value = "/html",produces = "application/html")
public String Returnxml() {
return "<!DOCTYPE html>\n" +
"<html>\n" +
"<head>\n" +
" <title>科技登录界面</title>\n" +
" <link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">\n" +
"</head>\n" +
"<body>\n" +
" <div class=\"container\">\n" +
" <h1>科技登录</h1>\n" +
" <form>\n" +
" <input type=\"text\" placeholder=\"用户名\" name=\"username\" required>\n" +
" <input type=\"password\" placeholder=\"密码\" name=\"password\" required>\n" +
" <input type=\"submit\" value=\"登录\">\n" +
" </form>\n" +
" <a href=\"https://www.example.com\">访问网站</a>\n" +
" </div>\n" +
"</body>\n" +
"</html>";
}
我们编写如下脚本
线程组:保持默认
HTTP信息头管理器:名称设置为content-type,对应的值设置为application/html
HTTP请求:协议设置为http,服务器名称或IP为127.0.0.1,端口为8091,方法为GET,路径为/html,内容编码为utf-8,其他保持默认
运行脚本,查看结果树,我们可以看到HTTP请求中响应数据的Response Body结果如下
<!DOCTYPE html>
<html>
<head>
<title>科技登录界面</title>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<div class="container">
<h1>科技登录</h1>
<form>
<input type="text" placeholder="用户名" name="username" required>
<input type="password" placeholder="密码" name="password" required>
<input type="submit" value="登录">
</form>
<a href="https://www.example.com">访问网站</a>
</div>
</body>
</html>
响应数据的Response headers为
HTTP/1.1 200
Content-Type: application/html;charset=UTF-8
Content-Length: 488
Date: Fri, 12 Jul 2024 02:50:58 GMT
Keep-Alive: timeout=60
Connection: keep-alive
请求的Request headers为
Connection: keep-alive
content-type: application/html
Host: 127.0.0.1:8091
User-Agent: Apache-HttpClient/4.5.7 (Java/1.8.0_101)
情况1:勾选主体
正则表达式提取器中设置要检查的响应字段为主体,引用名称为var,正则表达式为href=“(.*)”,匹配字符为-1,缺省值为NotFound
运行脚本,查看结果树中调试取样器的响应数据的Response Body
_jmeter.U_T_=线程组 1-1
var=NotFound
var_1=
var_1_g=1
var_1_g0=href=“style.css”
var_1_g1=style.css
var_2=
var_2_g=1
var_2_g0=href=“https://www.example.com”
var_2_g1=https://www.example.com
var_matchNr=2
情况2:勾选Body(unescaped)
正则表达式提取器中设置要检查的响应字段为Body(unescaped),其他配置不变
运行脚本,查看结果树中调试取样器的响应数据的Response Body
_jmeter.U_T_=线程组 1-1
var=NotFound
var_1=
var_1_g=1
var_1_g0=href=“style.css”
var_1_g1=style.css
var_2=
var_2_g=1
var_2_g0=href=“https://www.example.com”
var_2_g1=https://www.example.com
var_matchNr=2
情况3:勾选信息头
正则表达式提取器中设置要检查的响应字段为信息头,正则表达式设置为Content-Type: (.*),其他配置不变
运行脚本,查看结果树中调试取样器的响应数据的Response Body
_jmeter.U_T_=线程组 1-1
var=NotFound
var_1=
var_1_g=1
var_1_g0=Content-Type: application/html;charset=UTF-8
var_1_g1=application/html;charset=UTF-8
var_matchNr=1
情况4:勾选Request Headers
正则表达式提取器中设置要检查的响应字段为Request Headers,正则表达式设置为Host: (.*),其他配置不变
运行脚本,查看结果树中调试取样器的响应数据的Response Body
_jmeter.U_T_=线程组 1-1
var=NotFound
var_1=
var_1_g=0
var_1_g0=Host: 127.0.0.1:8091
var_matchNr=1
情况5:勾选URL
正则表达式提取器中设置要检查的响应字段为URL,正则表达式设置为.*,其他配置不变
运行脚本,查看结果树中调试取样器的响应数据的Response Body
_jmeter.U_T_=线程组 1-1
var=NotFound
var_1=
var_1_g=0
var_1_g0=http://127.0.0.1:8091/html
var_matchNr=1
情况5:勾选响应代码
正则表达式提取器中设置要检查的响应字段为响应代码,正则表达式设置为.*,其他配置不变
运行脚本,查看结果树中调试取样器的响应数据的Response Body
_jmeter.U_T_=线程组 1-1
var=NotFound
var_1=
var_1_g=0
var_1_g0=200
var_matchNr=1
情况6:勾选响应消息
正则表达式提取器中设置要检查的响应字段为响应消息,正则表达式设置为.*,其他配置不变
运行脚本,查看结果树中调试取样器的响应数据的Response Body
_jmeter.U_T_=线程组 1-1
var=NotFound
var_1=
var_1_g=0
var_1_g0=
var_matchNr=1
上述为空的原因是HTTP请求取样器结果中的Response message为空,所以得不到任何数据
情况7:勾选Body as a Document
正则表达式提取器中设置要检查的响应字段为响应消息,正则表达式设置为.*,其他配置不变
运行脚本,查看结果树中调试取样器的响应数据的Response Body
_jmeter.U_T_=线程组 1-1
var=NotFound
var_1=
var_1_g=0
var_1_g0=org.apache.tika.exception.TikaException: Failed to detect the character encoding of a document
var_matchNr=1
上述内容在对应的HTTP请求然后并且选择text变成document
然后在查看响应数据的Response Body也是如下错误
org.apache.tika.exception.TikaException: Failed to detect the character encoding of a document
总结
正确配置“提取器中的要检查的响应字段”是确保JMeter脚本能够准确、高效地处理动态数据的关键。根据实际需求选择合适的响应字段并结合恰当的提取规则,可以大幅提升测试脚本的灵活性和实用性。不同的提取器(如JSON Path Extractor、XPath Extractor)虽然细节上有所不同,但核心思想都是从响应中精准地捕获数据,以支持更复杂的测试场景。