浅谈后置处理器组件提取器相关的Apply to
在Apache JMeter中,“提取器”(通常指的是正则表达式提取器、JSON路径提取器或CSS/JQuery提取器等)是用来从服务器响应中提取信息的重要组件。这些信息可以是cookies、session IDs、特定的文本或者任何你需要在后续请求中复用的数据。"Apply to"是配置这些提取器时的关键设置,它们决定了JMeter如何处理和解析响应数据。
Apply to
“Apply to” 设置指定了JMeter应该在哪些响应上应用这个提取器。这个选项对于有多个采样器(Sampler)和需要根据具体情况选择在哪里提取数据的场景尤为重要。常见的选项包括:
● Main sample and sub-samples:同时应用于主采样器和所有子采样器的响应。当你需要从多个层次的响应中提取数据时,可以选择这个选项。
● Main sample only:默认选项,仅应用于主采样器的响应数据。基本情况下,我们只要选择“main sample only”,因为一般情况下,当我们发起一个请求时,实际包含的也只是一个请求。但有些情况下,发起一个请求时,会触发多个服务器请求,这时候就有main sample和sub-sample之分,比如发起重定向请求,此时会把重定向后的请求视为main-sample
● Sub-samples only:如果采样器发送了多个请求,如重定向,这个选项会告诉JMeter仅在子请求的响应上应用提取器。
● JMeter Variable:允许你指定一个JMeter变量名称,JMeter将从该变量中而不是直接从响应中提取数据。这对于从之前已经存储在变量中的数据中进一步提取信息非常有用。
实例说明
首先我们使用Spingboot框架编写测试脚本,改测试脚本接口按重定向内容,便于后续设置不同的参数进行测试,脚本如下:
@GetMapping("/getinfo")
public RedirectView redirectAndRequest(RedirectAttributes attributes) {
// 重定向到目标URL
RedirectView redirectView = new RedirectView();
redirectView.setUrl("http://127.0.0.1:8091/request");
return redirectView;
}
@GetMapping("/request")
@ResponseBody
public String handleRequest() {
ModelAndView modelAndView = new ModelAndView("redirect:/api/redirect");
// 发起请求到目标URL
RestTemplate restTemplate = new RestTemplate();
return restTemplate.getForObject("http://127.0.0.1:8091/welcome", String.class);
}
@GetMapping(value = "/welcome")
public String welcome(){
return "{\"total\":2,\"data\":[{\"id\":123,\"name\":\"John Doe\",\"email\":\"johndoe@example.com\",\"phone\":\"123-456-7890\",\"address\":{\"street\":\"123 Main St\",\"city\":\"New York\",\"state\":\"NY\",\"zip\":\"10001\"},\"interests\":[\"sports\",\"music\",\"travel\"]},{\"id\":456,\"name\":\"Jane Smith\",\"email\":\"janesmith@example.com\",\"phone\":\"987-654-3210\",\"address\":{\"street\":\"456 Elm St\",\"city\":\"Los Angeles\",\"state\":\"CA\",\"zip\":\"90001\"},\"interests\":[\"reading\",\"cooking\",\"hiking\"]}]}";
}
我们编写如下测试脚本
线程组:保持默认
用户定义的变量:名称设置为test,对应的值设置为Content-Length: test
HTTP请求:协议设置为http,服务器名称或IP为127.0.0.1,端口为8091,方法为GET,路径为/getinfo,内容编码为utf-8,其他保持默认
此时我们进行脚本运行,查看结果树,可以看到如下结果,我们这里可以理解为HTTP请求是Main Sample,而HTTP请求-0和HTTP请求-1为Sub Sample
点击HTTP请求记录响应数据中的Response headers数据内容如下:
HTTP/1.1 200
Content-Type: text/plain;charset=UTF-8
Content-Length: 433
Date: Thu, 11 Jul 2024 08:58:51 GMT
Keep-Alive: timeout=60
Connection: keep-alive
点击HTTP请求-0记录响应数据中的Response headers数据内容如下:
HTTP/1.1 302
Location: http://127.0.0.1:8091/request
Content-Language: zh-CN
Content-Length: 0
Date: Thu, 11 Jul 2024 08:58:51 GMT
Keep-Alive: timeout=60
Connection: keep-alive
点击HTTP请求-1记录响应数据中的Response headers数据内容如下:
HTTP/1.1 200
Content-Type: text/plain;charset=UTF-8
Content-Length: 433
Date: Thu, 11 Jul 2024 08:58:51 GMT
Keep-Alive: timeout=60
Connection: keep-alive
情况1:勾选Main Sample and sub-samples
我们将正则表达式提取器设置如下参数:
● Apply to:选择Main Sample and sub-samples
● 要检查的响应字段:选择信息头
● 引用名称:设置为var
● 正则表达式:设置为Content-Length: (.*),因为我们通过提取消息头中的Content-Length:后面的内容来模拟不同的选择方式获取的不同数据。
● 模板:设置为默认,即为空。
● 匹配数字(0代表随机):设置为-1
● 缺失值:设置为NotFound
运行脚本,查看结果树中的调试取样器中响应数据的Response Body内容,可以看到如下结果:
test=Content-Length: test
var=NotFound
var_1=
var_1_g=1
var_1_g0=Content-Length: 433
var_1_g1=433
var_2=
var_2_g=1
var_2_g0=Content-Length: 0
var_2_g1=0
var_3=
var_3_g=1
var_3_g0=Content-Length: 433
var_3_g1=433
var_matchNr=3
上述内容可以知道获取的数据为结果树中HTTP请求、HTTP请求-0以及HTTP请求-1对应消息头获取的数据。
情况2:勾选Main Sample only
我们将正则表达式提取器设置如下参数:
● Apply to:选择Main Sample only
● 其他参数保持跟情况1一致。
运行脚本,查看结果树中的调试取样器中响应数据的Response Body内容,可以看到如下结果:
test=Content-Length: test
var=NotFound
var_1=
var_1_g=1
var_1_g0=Content-Length: 433
var_1_g1=433
var_matchNr=1
根据上文中提到HTTP请求是Main Sample,而HTTP请求-0和HTTP请求-1为Sub Sample,所以当选择Main Sample only时,只提取了HTTP请求中响应数据的Response Headers的内容
情况3:勾选Sub-Samples only
我们将正则表达式提取器设置如下参数:
● Apply to:选择Sub-Samples only
● 其他参数保持跟情况1一致。
运行脚本,查看结果树中的调试取样器中响应数据的Response Body内容,可以看到如下结果:
test=Content-Length: test
var=NotFound
var_1=
var_1_g=1
var_1_g0=Content-Length: 0
var_1_g1=0
var_2=
var_2_g=1
var_2_g0=Content-Length: 433
var_2_g1=433
var_matchNr=2
根据上文中提到HTTP请求是Main Sample,而HTTP请求-0和HTTP请求-1为Sub Sample,所以当选择Main Sample only时,只提取了HTTP请求-0和HTTP请求-1中响应数据的Response Headers的内容
情况4:勾选JMeter Variable Names to Use
我们将正则表达式提取器设置如下参数:
● Apply to:选择JMeter Variable Names to Use,并且后面的输入框输入为test
● 其他参数保持跟情况1一致。
运行脚本,查看结果树中的调试取样器中响应数据的Response Body内容,可以看到如下结果:
test=Content-Length: test
var=NotFound
var_1=
var_1_g=1
var_1_g0=Content-Length: test
var_1_g1=test
var_matchNr=1
根据上文中指定一个JMeter变量名称,我们这里的变量名称为我们在用户定义的变量中增加的变量,即为test,对应的内容为Content-Length: test,因此我们得到对应的数据即为var_1_g0=Content-Length: test。
总结
正确理解和配置"Apply to" 对于构建高效、准确的性能测试脚本至关重要,能够帮助你精确控制数据的提取过程,确保测试流程的顺畅执行。