当前位置: 首页 > news >正文

浅谈前置处理器之用户参数

浅谈前置处理器之用户参数

“用户参数”前置处理器是一个非常实用的功能,它可以在每个请求执行前动态地为HTTP请求等添加或替换变量值。本文档将详细介绍“用户参数”前置处理器的使用方法、特点以及与用户定义变量的区别。

用户参数前置处理器简介

用户参数前置处理器允许你在每个线程或迭代中为HTTP请求等添加一组可变的参数值。这在需要模拟不同用户登录、提交表单等场景时特别有用,因为它可以确保每个虚拟用户(线程)使用唯一的数据集。通过定义一系列参数及其可选的值集合,JMeter会在每次请求之前根据配置更新这些参数。

使用场景

● 模拟多个用户登录:为每个用户分配不同的用户名和密码。
● 测试搜索功能:使用不同的查询关键词进行搜索请求。
● 多样性数据测试:提交表单时使用不同的数据组合,以覆盖更广泛的测试场景。

配置步骤

  1. 添加用户参数前置处理器:
    ○ 在JMeter测试计划中,选择一个HTTP请求或其他需要动态参数的采样器。
    ○ 右键点击该采样器,选择“添加” -> “前置处理器” -> “用户参数”。
  2. 定义参数:
    ○ 在“用户参数”配置界面,点击“添加变量”按钮来添加新的参数名称及其值。
    ○ 对于每个参数,你可以指定默认值、可选的值列表(用于循环)或使用函数来动态生成值。
  3. 配置迭代更新:
    ○ 通过勾选“每次迭代更新一次”选项,你可以控制参数值是否在每个迭代中更新。如果未勾选,参数值在整个线程生命周期内保持不变。
  4. 作用域考虑:
    ○ 注意,用户参数的作用域遵循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的“用户参数”前置处理器是提高测试脚本灵活性和效率的强大工具,尤其在需要处理多样性和动态数据的场景中。通过熟练掌握其配置和应用,测试工程师可以构建更加贴近实际使用情况的测试场景,从而更有效地评估系统性能和稳定性。

相关文章:

  • 一文学会LVS:概念、架构、原理、搭建过程、常用命令及实战案例
  • 基于Java微信小程序小说阅读系统设计和实现(源码+LW+调试文档+讲解等)
  • 使用 Vue 实现包含单选框的弹窗功能(附Demo)
  • 苹果公司的Wifi定位服务(WPS)存在被滥用的风险
  • GPIO和PIN
  • 用户想知道数据库每天增长几个G,到底都是啥?
  • Jmeter 入门指南:从零开始学习
  • 【分享】Word“打开密码”的常见问题及解决方法
  • electron教程(一)创建项目
  • uniapp + vue3 + Script Setup 写法变动 (持续更新)
  • IP白名单及其作用解析
  • 获取HTML元素的offsetParent属性
  • 传输线在阻抗匹配时串联端接电阻为什么要靠近发送端
  • Java_多线程:线程池
  • Spring Boot与Apache Kafka的深度集成
  • Objective-C 中关联引用的概念
  • python学习笔记-类对象的信息
  • Vue 2.3、2.4 知识点小结
  • vue--为什么data属性必须是一个函数
  • 从PHP迁移至Golang - 基础篇
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 力扣(LeetCode)56
  • 前端js -- this指向总结。
  • 前嗅ForeSpider教程:创建模板
  • 试着探索高并发下的系统架构面貌
  • 一份游戏开发学习路线
  • 用jQuery怎么做到前后端分离
  • 再谈express与koa的对比
  • 回归生活:清理微信公众号
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​secrets --- 生成管理密码的安全随机数​
  • #Ubuntu(修改root信息)
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (实战篇)如何缓存数据
  • (四)图像的%2线性拉伸
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)四层和七层负载均衡的区别
  • *** 2003
  • *2 echo、printf、mkdir命令的应用
  • .bashrc在哪里,alias妙用
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .NET Framework杂记
  • /etc/shadow字段详解
  • @for /l %i in (1,1,10) do md %i 批处理自动建立目录
  • @Pointcut 使用
  • [ASP.NET MVC]Ajax与CustomErrors的尴尬
  • [C#7] 1.Tuples(元组)
  • [EFI]英特尔 冥王峡谷 NUC8i7HVK 电脑 Hackintosh 黑苹果efi引导文件