浅谈后置处理器之边界提取器
边界提取器(Boundary Extractor)作为一种常用的后置处理器,主要用于从服务器响应中提取特定内容,这些内容可以是文本、变量或cookies等,以便于后续请求中重用。本文档将详细介绍如何在JMeter中使用边界提取器。
适用场景
边界提取器适用于需要从HTML、JSON、XML等格式的响应数据中精确提取特定字符串的场景。例如,在进行网页自动化测试时,从登录成功的响应中提取session ID;或者在API测试中,从返回的数据中提取某个特定值作为下一次请求的参数等。
配置步骤
- 添加边界提取器:
○ 在JMeter的工作台或测试计划中,右键点击你想要应用后处理的采样器(如HTTP请求),选择“添加” > “后置处理器” > “边界提取器”。 - 配置边界提取器参数:
○ 引用名称(Reference Name):这是存储提取结果的变量名。在后续的请求或断言中,可以通过该变量名引用提取的值。
○ 左边界(Left Boundary):输入一个字符串,表示提取内容开始前的边界标记。JMeter会找到这个边界之后的内容。
○ 右边界(Right Boundary):输入一个字符串,表示提取内容结束后的边界标记。JMeter会在找到左边界后,停止于右边界之前提取内容。
○ 缺省值(Default Value):如果正则表达式未匹配到任何内容,将使用此默认值。可选填。 - 执行与验证:
○ 配置完成后,运行测试计划。在查看结果树监听器中,你可以看到边界提取器提取的结果是否符合预期。
应用实例
首先我们使用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"
}
边界提取器:Apply to选择Main Sample only,要检查的响应字段选择主体,上述两个选择项后续专门会有实例文档输出介绍。引用名称设置为var,左边界设置为"phone":,右边界设置为,“address”,注意address引号前面的逗号也是,匹配数字设置为0,缺省值为NotFound,上述设置的目的是可以通过测试样例代码返回值看到我们通过左右边界提取到"phone":“123-456-7890”,“address”:中间的内容,即电话号码,并且有两个值,匹配数字我们选择了0,所以随机选择一个
{"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"]}]}
设置好以后,运行脚本,查看结果树,在结果树中查看调试取样器的响应数据中的Response Body,可以看到我们的参数var会有如下结果var=“123-456-7890”
注意事项
● 边界的选择:选择合适的左右边界对于准确提取内容至关重要。确保所选边界在响应数据中是唯一的,避免误提取或提取失败。
● 调试与测试:利用“查看结果树”或“调试取样器”进行实时调试,可以帮助快速定位并修正配置错误。
● 性能影响:虽然边界提取器非常有用,但每个正则表达式匹配都会消耗资源。在大规模测试中,应谨慎使用,避免对性能造成不必要的影响。
总结
边界提取器是JMeter中一个强大且灵活的工具,它通过结合正则表达式和边界定义,帮助用户从响应数据中精准提取信息。正确配置和使用边界提取器,能够大幅提升测试脚本的复用性和灵活性,特别是在处理动态数据和复杂场景时。通过实践和不断调试,你可以更好地掌握其使用技巧,从而提高测试效率和准确性。