浅谈前置处理器之用户参数
“用户参数”前置处理器是一个非常实用的功能,它可以在每个请求执行前动态地为HTTP请求等添加或替换变量值。本文档将详细介绍“用户参数”前置处理器的使用方法、特点以及与用户定义变量的区别。
用户参数前置处理器简介
用户参数前置处理器允许你在每个线程或迭代中为HTTP请求等添加一组可变的参数值。这在需要模拟不同用户登录、提交表单等场景时特别有用,因为它可以确保每个虚拟用户(线程)使用唯一的数据集。通过定义一系列参数及其可选的值集合,JMeter会在每次请求之前根据配置更新这些参数。
使用场景
● 模拟多个用户登录:为每个用户分配不同的用户名和密码。
● 测试搜索功能:使用不同的查询关键词进行搜索请求。
● 多样性数据测试:提交表单时使用不同的数据组合,以覆盖更广泛的测试场景。
配置步骤
- 添加用户参数前置处理器:
○ 在JMeter测试计划中,选择一个HTTP请求或其他需要动态参数的采样器。
○ 右键点击该采样器,选择“添加” -> “前置处理器” -> “用户参数”。 - 定义参数:
○ 在“用户参数”配置界面,点击“添加变量”按钮来添加新的参数名称及其值。
○ 对于每个参数,你可以指定默认值、可选的值列表(用于循环)或使用函数来动态生成值。 - 配置迭代更新:
○ 通过勾选“每次迭代更新一次”选项,你可以控制参数值是否在每个迭代中更新。如果未勾选,参数值在整个线程生命周期内保持不变。 - 作用域考虑:
○ 注意,用户参数的作用域遵循JMeter的作用域规则,即它影响其所在作用域内的所有采样器,除非被更小作用域的变量覆盖。
应用实例
我们编写如下脚本
线程组:线程数设置为3
用户参数:添加一个变量test,添加三个用户数据用户_1为First${__Random(1,1000,)},用户_2为Second${__Random(1,1000,)},用户_3为Third${__Random(1,1000,)}
BeanShell 取样器1:编写如下代码
log.info("用户:${test}");
BeanShell 取样器2:编写如下代码
log.info("用户:${test}");
情况1:不勾选每次迭代更新一次
运行脚本,查看JMeter打印日志
2024-07-03 09:45:57,616 INFO o.a.j.u.BeanShellTestElement: 用户:First929
2024-07-03 09:45:57,618 INFO o.a.j.t.ThreadGroup: Started thread group number 1
2024-07-03 09:45:57,618 INFO o.a.j.u.BeanShellTestElement: 用户:First223
2024-07-03 09:45:57,618 INFO o.a.j.e.StandardJMeterEngine: All thread groups have been started
2024-07-03 09:45:57,619 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-1
2024-07-03 09:45:57,620 INFO o.a.j.t.JMeterThread: Thread finished: 线程组 1-1
2024-07-03 09:45:57,915 INFO o.a.j.t.JMeterThread: Thread started: 线程组 1-2
2024-07-03 09:45:57,917 INFO o.a.j.u.BeanShellTestElement: 用户:Second477
2024-07-03 09:45:57,918 INFO o.a.j.u.BeanShellTestElement: 用户:Second77
2024-07-03 09:45:57,919 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-2
2024-07-03 09:45:57,919 INFO o.a.j.t.JMeterThread: Thread finished: 线程组 1-2
2024-07-03 09:45:58,254 INFO o.a.j.t.JMeterThread: Thread started: 线程组 1-3
2024-07-03 09:45:58,254 INFO o.a.j.u.BeanShellTestElement: 用户:Third732
2024-07-03 09:45:58,254 INFO o.a.j.u.BeanShellTestElement: 用户:Third525
通过结果可以看出每次线程每个BeanShell请求都更新变量值
情况2:勾选每次迭代更新一次
运行脚本,查看JMeter打印日志
2024-07-03 09:48:19,188 INFO o.a.j.t.JMeterThread: Thread started: 线程组 1-1
2024-07-03 09:48:19,188 INFO o.a.j.u.BeanShellTestElement: 用户:First831
2024-07-03 09:48:19,188 INFO o.a.j.u.BeanShellTestElement: 用户:First831
2024-07-03 09:48:19,188 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-1
2024-07-03 09:48:19,188 INFO o.a.j.t.JMeterThread: Thread finished: 线程组 1-1
2024-07-03 09:48:19,242 INFO o.a.j.t.ThreadGroup: Started thread group number 1
2024-07-03 09:48:19,242 INFO o.a.j.e.StandardJMeterEngine: All thread groups have been started
2024-07-03 09:48:19,545 INFO o.a.j.t.JMeterThread: Thread started: 线程组 1-2
2024-07-03 09:48:19,547 INFO o.a.j.u.BeanShellTestElement: 用户:Second229
2024-07-03 09:48:19,549 INFO o.a.j.u.BeanShellTestElement: 用户:Second229
2024-07-03 09:48:19,550 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-2
2024-07-03 09:48:19,550 INFO o.a.j.t.JMeterThread: Thread finished: 线程组 1-2
2024-07-03 09:48:19,901 INFO o.a.j.t.JMeterThread: Thread started: 线程组 1-3
2024-07-03 09:48:19,901 INFO o.a.j.u.BeanShellTestElement: 用户:Third8
2024-07-03 09:48:19,901 INFO o.a.j.u.BeanShellTestElement: 用户:Third8
通过结果可以看到不同线程数据会变,但是同一个线程内的数据是不变的。
与用户定义变量的区别
● 用户定义变量是在测试计划开始时就设置好的静态变量,适用于整个测试计划或特定作用域,不会在测试执行过程中改变。
● 用户参数则是在每个线程每次迭代时动态生成或更新的,适合需要为每个请求提供不同数据的场景。
实践技巧
● 参数化值:利用CSV Data Set Config结合用户参数,可以从外部文件导入大量测试数据,进一步增强测试的真实性和复杂度。
● 配合正则表达式提取器:用户参数可以与正则表达式提取器结合使用,将上一个响应的数据动态地作为下一个请求的参数。
结论
JMeter的“用户参数”前置处理器是提高测试脚本灵活性和效率的强大工具,尤其在需要处理多样性和动态数据的场景中。通过熟练掌握其配置和应用,测试工程师可以构建更加贴近实际使用情况的测试场景,从而更有效地评估系统性能和稳定性。