浅谈后置处理器之正则表达式提取器
JMeter是一款功能强大的开源负载测试工具,广泛应用于Web应用、数据库等的性能测试。在进行接口测试或负载测试时,经常需要从服务器响应中提取某些数据作为后续请求的参数。这时,“正则表达式提取器”(Regular Expression Extractor)就发挥了重要作用。本指南将详细介绍如何在JMeter中使用正则表达式提取器来捕获并提取响应数据。
什么是正则表达式提取器?
正则表达式提取器是JMeter的一个后置处理器元件,它能够从 sampler(如HTTP请求)的响应数据中,根据提供的正则表达式查找并提取匹配的文本内容。提取的数据可以存储为变量,供后续的请求或测试逻辑使用。
何时使用正则表达式提取器?
● 动态参数处理:当请求之间存在依赖,且某个参数值需从上一个响应中获取时(如会话Token、动态ID等)。
● 数据验证:验证响应数据中是否包含预期的文本模式。
● 数据提取与分析:从复杂的响应中提取特定信息,用于进一步的处理或测试报告。
如何添加正则表达式提取器?
- 在JMeter的工作台或测试计划中,选择一个sampler(如HTTP请求)。
- 右键点击该sampler,选择“添加” -> “后置处理器” -> “正则表达式提取器”。
正则表达式提取器配置详解
正则表达式提取器的配置界面包含以下几个关键参数:
● 名称参考:为提取的变量指定一个引用名称。后续可在JMeter中通过${变量名}来引用提取的值。
● 正则表达式:用于匹配响应数据的正则表达式。确保表达式能准确地匹配到你想要提取的内容。
● 模板:定义了如何构建结果变量。最常用的值是
1
1
1,表示使用第一个匹配组的值。如果有多个匹配项,可以使用
2
2
2、
3
3
3等。
● 匹配数字:指定使用哪个匹配项。0表示随机,1表示第一个匹配,-1表示所有匹配项。
● 缺省值:如果正则表达式没有匹配到任何内容时,使用的默认值。
应用实例
首先我们使用SpingBoot编写部分测试接口代码
@PostMapping(value = "/login",produces = "application/json;charset=UTF-8")
public String authenticate(@RequestBody JSONObject request) {
String validUsername = "admin";
String validPassword = "password";
String response = "{\"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\"]}]}";
if (request.getString("username").equals(validUsername) && request.getString("password").equals(validPassword)) {
return response;
} else {
return response;
}
}
我们编写如下测试脚本
线程组:保持默认
HTTP信息头管理器:名称content-type,值为application/json;charset=UTF-8
HTTP请求:协议http,服务器名称或IP为127.0.0.1,端口设置为8091,方法为post,路径/login,内容编码为utf-8,消息体数据设置如下
{
"username": "admin",
"password": "password"
}
运行脚本,查看结果树,在HTTP请求的响应数据中Response Body查看结果如下:
{"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"]}]}
正则表达式简单介绍:
● 正则表达式中的( )里面需要写匹配规则,用于提取对应内容。
● 正则表达式中的.?表示匹配任意长度的任意字符,比较常用。
● 在日常工作中,一般使用(.+?)和(.?)能够满足我们多数测试场景。
详细的正则表达式内容可以查看如下百度百科资料:正则表达式
情况1:获取所有数据
正则表达式设置:
Apply to:Main sample only
要检查的响应字段:主体
引用名称:value
正则表达式:根据结果树中查看返回的信息,我们假设提取"id"😦.*?),“name”:中间ID的数据
模板:为空
匹配数字:设置为-1
缺省值:设置为NotFound
运行脚本,查看结果树中调试取样器的响应数据的Response Body
value=NotFound
value_1=
value_1_g=1
value_1_g0=“id”:123,“name”:
value_1_g1=123
value_2=
value_2_g=1
value_2_g0=“id”:456,“name”:
value_2_g1=456
value_matchNr=2
情况2:随机获取某个数据
正则表达式设置:
Apply to:Main sample only
要检查的响应字段:主体
引用名称:value
正则表达式:根据结果树中查看返回的信息,我们假设提取"id"😦.*?),“name”:中间ID的数据
模板:为空
匹配数字:设置为0
缺省值:设置为NotFound
运行脚本,查看结果树中调试取样器的响应数据的Response Body
value=
value_g=1
value_g0=“id”:123,“name”:
value_g1=123
情况3:随机获取某个数据,并且使用模板/ 0 / 0/ 0/
正则表达式设置:
Apply to:Main sample only
要检查的响应字段:主体
引用名称:value
正则表达式:根据结果树中查看返回的信息,我们假设提取"id"😦.*?),“name”:中间ID的数据
模板:$0$
匹配数字:设置为0
缺省值:设置为NotFound
运行脚本,查看结果树中调试取样器的响应数据的Response Body
value=“id”:456,“name”:
value_g=1
value_g0=“id”:456,“name”:
value_g1=456
此时可以看到,value的值与value_g0相等
情况4:随机获取某个数据,并且使用模板/ 1 / 1/ 1/
正则表达式设置:
Apply to:Main sample only
要检查的响应字段:主体
引用名称:value
正则表达式:根据结果树中查看返回的信息,我们假设提取"id"😦.*?),“name”:中间ID的数据
模板:$1$
匹配数字:设置为0
缺省值:设置为NotFound
运行脚本,查看结果树中调试取样器的响应数据的Response Body
value=456
value_g=1
value_g0=“id”:456,“name”:
value_g1=456
此时可以看到,value的值与value_g1相等
小贴士
● 使用在线正则表达式测试工具预先测试你的正则表达式,确保能正确匹配目标内容。
● 注意正则表达式的贪婪与非贪婪匹配,适当使用?来控制。
● 当提取JSON或XML格式的数据时,考虑使用JSON Extractor或XPath Extractor,这些专门的处理器可能更方便、准确。
总结
通过以上步骤和说明,你应该能够有效地在JMeter测试中利用正则表达式提取器来处理动态数据和提高测试脚本的灵活性。