浅谈前置处理器之正则表达式用户参数
正则表达式用户参数(RegEx User Parameters) 是一种前置处理器(Pre-Processor),它允许用户根据正则表达式从响应数据中提取值后进行应用,并将这些值作为参数传递给后续的HTTP请求或其他需要的地方。此功能对于处理动态内容、会话ID、令牌等具有高度灵活性,是实现自动化测试脚本的关键组成部分。
使用场景
- 动态参数处理:当目标系统在每次请求中生成不同的动态参数(如会话ID、时间戳等),需要提取后续并使用这些参数继续后续请求。
- 测试数据个性化:根据响应内容个性化后续请求的参数,比如从登录响应中提取用户ID用于后续的个人资料查询请求。
- 数据迭代:如果响应中包含多组匹配项,可以配置处理器循环提取后应用于多个请求,适用于测试列表或搜索结果页面。
配置步骤
- 添加正则表达式用户参数:
○ 在JMeter的工作台或测试计划中,选中一个HTTP请求或其他需要参数化的取样器。
○ 右键点击选择“添加” > “前置处理器” > “正则表达式用户参数”。 - 配置参数:
○ Regular Expression Reference Name:正则表达式提取器中的变量名称,此处的名称必须要与正则表达式中的一致。
○ Parameter names regexp group number:参数名字的组号,后续样例详细说明。
○ Parameter values regex group number:参数名称组对应值,后续样例详细说明。
实例说明
我们使用SpringBoot编写如下部分接口代码
@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\":\"[email protected]\",\"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\":\"[email protected]\",\"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请求1:协议http,服务器名称或者IP127.0.0.1,端口号8091,方法POST,路径/login,内容编码utf-8,消息体数据
{
"username": "admin",
"password": "password"
}
正则表达式提取器:设置的参数为引用名称var,正则表达式"id"😦.?),“name”:"(.?)",“email”(可以根据样例代码中的内容可知),而我们的目的是提取到id和name,匹配数字设置为-1,缺省值为NotFound
此时我们可以先禁用HTTP请求2和正则表达式用户参数,然后运行脚本,查看结果树的调试取样器,在响应数据的Response Body中可以看到如下结果
JMeterVariables:
JMeterThread.last_sample_ok=false
JMeterThread.pack=org.apache.jmeter.threads.SamplePackage@4fa1cf1
START.HMS=165132
START.MS=1720515092259
START.YMD=20240709
TESTSTART.MS=1720578466746
_jm__线程组__idx=0
_jmeter.U_T=线程组 1-1
var=NotFound
var_1=
var_1_g=2
var_1_g0=“id”:123,“name”:“John Doe”,“email”
var_1_g1=123
var_1_g2=John Doe
var_2=
var_2_g=2
var_2_g0=“id”:456,“name”:“Jane Smith”,“email”
var_2_g1=456
var_2_g2=Jane Smith
var_matchNr=2
上述内容我们可以看到对应的正则表达式提取的关于var变量的值,此时我们可以继续验证正则表达式用户参数这个前置处理器的应用,继续设置其他组件参数。
HTTP请求2:协议http,服务器名称或者IP127.0.0.1,端口号8091,方法POST,路径/login,内容编码utf-8,然后参数中添加两个参数,名称分别填写123,456,先不用管具体的意义,这里先卖个关子。
正则表达式用户参数:Regular Expression Reference Name设置为var,这里的参数名称一定要与上述正则表达式中的参数名称一致,Parameter names regexp group number设置为1,Parameter values regex group number设置为2,为什么要这么设置呢?我们可以这么理解,在HTTP请求2中我们不是设置了123和456嘛,Parameter names regexp group number设置为1可以理解为在var的参数中取var_1_g1和var_2_g1的参数,当我们HTTP请求2中填写的参数跟这里面的参数一致以后,我们就对应上参数与数据的关系,为Parameter values regex group number设置为2铺垫,我们可以很好的理解当Parameter values regex group number设置为2时,取到的参数变成var_1_g2和var_2_g2。
接下来就是验证我们的结果,运行脚本查看结果树中HTTP请求2中Request Body的post data数据,总体上看我们的请求是失败的,但是这个没关系,我们只是验证了我们需要验证的内容,跟结果无关
POST http://127.0.0.1:8091/login
POST data:
123=John+Doe&456=Jane+Smith
[no cookies]
从上述POST data可以看到对应的数据已经在请求中体现。
注意事项
● 作用域:正则表达式用户参数只对紧随其后的HTTP请求或取样器生效,若需全局应用,请考虑使用“正则表达式提取器”并配合变量。
● 调试:利用“查看结果树”监听器检查正则表达式的匹配情况,确保正确提取数据。
总结
正则表达式用户参数是JMeter中一个强大的特性,它简化了动态数据的处理流程,提升了测试脚本的灵活性和自动化程度。正确配置和利用这一功能,可以有效应对复杂系统的性能测试需求。