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

JMeter 的 If Controller:开启性能测试的智能大门

嘿,宝子们!今天咱们就来聊聊 JMeter 里超级厉害的 If Controller,它就像是一把神奇的钥匙,能帮我们打开灵活测试的大门,让你的测试计划变得更加智能和高效。

一、If Controller 初印象

想象一下,你正在指挥一场精彩的演出,每个演员(测试元件)都在等待你的指令。If Controller 呢,就是那个聪明的舞台调度员,它会根据你设定的条件,决定哪些演员该上台表演(执行测试操作),哪些演员要在后台待命(跳过测试操作)。这是不是很厉害呢?接下来,咱们就一步步看看怎么用好这个神奇的调度员。

二、添加 If Controller 三步走

  1. 当你打开 JMeter,就像是来到了一个空旷的大舞台,首先要做的就是创建一个测试计划,这就是我们演出的大纲啦。
  2. 然后,在测试计划里添加一个线程组,这可以看作是一群充满活力的小演员,他们会按照我们的安排进行各种表演。
  3. 最后,在线程组下面,右键点击,选择 “添加” - > “逻辑控制器” - > “If Controller”,瞧,我们的智能调度员 If Controller 就闪亮登场啦!
    在这里插入图片描述

三、配置 If Controller 大揭秘

在这里插入图片描述

(一)给它取个好名字和写个注释

就像我们每个人都有自己的名字一样,If Controller 也需要一个独特的名字,这样在复杂的测试计划中,你一眼就能认出它。比如说,你在测试一个电商网站的购物流程,用 If Controller 来判断用户是否登录成功后才能进行购物车操作,那你可以给它取名叫 “购物车的登录门禁”。

注释呢,就像是给它写个小传记,简单说明一下它的作用。比如 “这个 If Controller 负责把关,只有用户登录成功,才让购物车操作的请求通过哦”。这样,不仅你自己清楚,以后其他小伙伴看你的测试计划,也能马上明白。

(二)条件表达式 —— 核心魔法咒语

这可是 If Controller 最厉害的地方,就像一个魔法咒语,决定着测试流程的走向。

  • 简单咒语示例
    • 假设我们有一个变量${isLoggedIn},当用户登录成功后,这个变量的值会变成 “true”。那我们在条件表达式里写上${isLoggedIn} == "true",就像对 If Controller 说:“嘿,如果用户登录了,就执行下面的操作吧。”
    • 再比如,用${__groovy(2 > 1)}这个咒语,这是在考验 If Controller 的数学知识,当然 2 大于 1 是常识啦,所以这个条件总是成立,适合在一些简单的测试场景中用来确保某个操作一定会执行,就像一个保底的小魔法。
  • 复杂咒语组合技巧
    • 在一个社交媒体平台的测试中,我们可能有变量${userHasFriends}表示用户是否有好友,${userIsActive}表示用户是否活跃。那我们可以写一个复杂一点的咒语:${__groovy(${userHasFriends} == "true" && ${userIsActive} == "true")}。这就像是告诉 If Controller:“只有当用户既有好友,又很活跃的时候,才执行特定的操作,比如推荐热门话题。” 这里的 “&&” 就像一个连接两个条件的魔法胶水,只有两边的条件都满足,整个咒语才生效。
    • 还有一种情况,比如在一个在线游戏的测试中,我们想判断用户是不是 VIP 或者是不是达到了一定的等级,就可以用 “||”(或)这个魔法符号,像这样:${__groovy(${userIsVIP} == "true" || ${userLevel} > 10)}。这意味着只要用户是 VIP 或者等级大于 10,就能享受到一些特殊待遇,比如进入隐藏关卡,If Controller 就会执行相应的操作。
    • 多层嵌套魔法阵
      • 想象一下在一个大型在线学习平台的测试中,我们要根据不同的课程类型、用户的学习进度和是否付费来决定给用户展示什么样的学习资源。我们可以构建这样一个多层嵌套的魔法阵:${__groovy(((${courseType} == "Science" && ${userProgress} > 50) || (${courseType} == "Art" && ${userIsPaid} == "true")))}。这就像是一个复杂的迷宫,If Controller 要根据这些条件找到正确的路径,只有满足其中一组嵌套条件,才会执行如推荐高级课程、解锁额外学习资料等操作。是不是很神奇呢?
  • 调试魔法咒语的小窍门
    • 当我们写了一个复杂的魔法咒语,有时候可能会出现意想不到的情况,这时候就需要调试啦。我们可以请出 “调试采样器” 这个小助手。在测试计划里,在线程组下右键点击 - > 添加 - > 取样器 - > 调试取样器,然后运行测试。之后在 “查看结果树” 中,我们就能看到调试信息,就像拿到了魔法咒语的解析说明书,里面会显示条件表达式中各个变量的值以及整个表达式的求值结果。比如说,如果我们在上面的社交媒体平台测试中,发现推荐热门话题的操作没有按照预期执行,通过调试采样器,我们可能会发现原来是${userHasFriends}变量的值获取错了,或者是逻辑运算符用得不对,这样就能快速修复问题,让魔法咒语重新生效。
    • 记住哦,条件表达式一定要写得准确无误,不然 If Controller 可就会 “晕头转向”,不知道该怎么执行了,就像你给一个机器人下达了混乱的指令,它就没办法正常工作啦。

(三)性能相关的魔法选项

  • 神奇的警告提示
    • 你会看到一个像智慧老人的警告提示:“For performance it is advised to check ‘Interpret Condition as Variable Expression’ and use __jexl3 or __groovy evaluating to true or false or a variable that contains true or false.” 这就像是在你踏上性能优化的冒险之旅前,一位经验丰富的导师给你的宝贵建议。如果你按照它说的做,在高并发或者大规模负载测试的魔法世界里,你的测试就能跑得更顺畅,就像给你的测试马车装上了飞速的魔法轮子,避免陷入性能的泥沼。
  • 把条件解释为变量表达式 —— 隐藏的性能宝藏
    • 当你勾选 “Interpret Condition as Variable Expression” 这个选项时,JMeter 就会变得更加聪明。比如说,你在一个在线音乐平台的测试中,有一个条件表达式${isPremiumUser},如果这个变量存在并且值为 “true”(代表用户是高级会员),If Controller 就会知道要执行给高级会员的专属操作,比如提供无损音乐下载。
    • 背后的魔法原理
      • 当 JMeter 遇到这个勾选的选项时,它会像一个敏锐的侦探,在变量的世界里寻找条件表达式的值对应的变量。如果找到了,并且这个变量的值符合 JMeter 对于真假的判断标准(非空字符串、非零数字等被视为真,空字符串、零等被视为假),那么条件表达式的结果就确定了。这种方式在处理大量变量和复杂条件时,就像找到了一条捷径,减少了不必要的计算,让测试跑得更快,特别是在高并发的场景下,就像一群飞鸟,能够更高效地穿越云层,到达目的地。
    • 什么时候开启这个宝藏
      • 在高并发测试场景中,如果你的条件表达式依赖于很多变量,比如在一个拥有海量用户的在线视频平台测试中,要根据用户的各种属性(如会员等级、观看历史、偏好设置等)来决定推荐不同的视频内容,这时候启用这个选项,就能大大提升性能,让你的测试如鱼得水,轻松应对高负载的挑战。
  • 对所有子节点求值 —— 双刃剑魔法
    • 当你勾选 “Evaluate for all children” 这个选项时,就像是给每个子节点都赋予了一个独立的小魔法,它们都会根据条件表达式来决定自己是否要行动。
    • 比如在一个企业级的办公自动化系统测试中,If Controller 下面有多个子节点,分别代表不同部门的文档审批流程。如果勾选了这个选项,每个部门的审批流程都会根据自己的条件(如文档类型、审批人权限等)来判断是否执行,就像每个部门都有自己的小裁判,根据规则决定是否参加这场审批的 “比赛”。
    • 性能影响的魔法权衡
      • 但是要注意哦,当有很多子节点并且条件表达式很复杂的时候,这把双刃剑就可能会消耗更多的魔法能量(性能),因为每个子节点都要独立地对条件表达式进行求值。不过在某些情况下,这种消耗是值得的。比如在一个需要对不同用户组进行精细化测试的场景中,每个子节点代表不同用户组的特定操作,这时候对每个子节点单独求值可以确保每个用户组的操作都能根据自己的条件准确执行,虽然会消耗更多的性能,但能保证测试的准确性和完整性,就像为了打造一件完美的魔法神器,需要花费更多的时间和精力。相反,如果子节点的操作比较相似,条件表达式也简单,不勾选这个选项可能会让你的测试更高效,就像选择了一条更平坦的道路,减少不必要的魔法消耗,避免陷入性能瓶颈的黑暗森林。

(四)使用上次采样的状态 —— 巧妙的魔法联动

  • 配置方法的小魔法
    • 有一个 “Use status of last sample” 复选框和一个神奇的变量${JMeterThread.last_sample_ok}。比如说在一个网页表单提交系统的测试中,如果勾选这个复选框,If Controller 就会根据上次表单提交的采样结果(是否成功)来决定下一步的操作。
    • 假设上次表单提交成功(返回状态码在 200 - 299 之间),那么${JMeterThread.last_sample_ok}变量的值就会变成 “true”,这时候 If Controller 就会执行如显示提交成功提示、跳转到下一个页面等后续操作,就像一个默契的接力赛,前一个操作的结果传递给了 If Controller,决定了下一步的走向。
  • 结合其他条件表达式的魔法组合
    • 在一个在线论坛的测试中,我们希望只有当上一个帖子发布请求成功并且用户的账号状态为 “正常” 时,才执行推荐相关热门帖子的后续请求。我们可以使用这样的魔法组合:${JMeterThread.last_sample_ok} && ${userAccountStatus} == "normal"。这就像是给 If Controller 戴上了两副眼镜,只有通过这两个条件的 “视力测试”,它才会执行推荐热门帖子的操作,让测试更加贴近真实的用户场景,就像一个经验丰富的魔法师,根据多种因素来施展魔法,而不是只看单一的条件。

四、添加子节点 —— 组建你的魔法表演团队

在 If Controller 下面,我们可以添加各种需要根据条件执行的元件,就像为我们的魔法表演招募不同的演员。比如右键点击 If Controller - > 添加 - > Sampler - > HTTP 请求,这就像是邀请了一个擅长发送 HTTP 请求的小精灵加入我们的团队。

然后,我们要给这个小精灵配置好任务,也就是配置 HTTP 请求的 URL、方法、参数等信息。比如说在测试一个在线旅游预订网站时,我们可以配置请求的 URL 为查询特定旅游线路详情的接口地址,方法为 GET,参数包括出发地、目的地、出行日期等,这样当 If Controller 的条件满足时,这个小精灵就会出发去获取旅游线路的详细信息,就像派一个小信使去远方带回珍贵的情报,来检查在满足特定条件(如用户已登录、搜索条件有效等)时,网站是否能够正确提供旅游线路的详细信息,确保网站的核心功能在各种条件下都能正常运行,为用户提供准确、及时的服务。

五、设置变量值 —— 准备魔法原料

  1. 在线程组下,右键点击 - > 添加 - > 配置元件 - > 用户定义的变量,这就像是打开了一个装满魔法原料的宝箱,我们可以在这里定义各种变量。
  2. 比如在测试一个智能家居控制系统时,如果条件表达式中有 “${roomTemperature}”,我们可以在 “用户定义的变量” 中添加这个变量,并设置其值为 “25”(假设当前测试环境模拟的房间温度为 25 摄氏度),这些变量就像魔法原料,将在后续的条件判断中发挥重要作用,决定着 If Controller 的行为,就像不同的魔法原料混合在一起,会产生不同的魔法效果。
  3. 使用 BeanShell 或 JSR223 处理复杂魔法逻辑示例
    • 有时候,我们需要更强大的魔法来处理复杂的变量逻辑。在 JMeter 中,BeanShell 或 JSR223 元件就是我们的魔法工具。例如,在测试一个股票交易系统时,假设我们要根据前一个请求获取的股票价格和用户设定的买入价格来动态设置一个变量 “${shouldBuy}”,以决定是否执行买入操作。我们可以在 BeanShell Sampler 中编写如下神奇的代码:
double stockPrice = Double.parseDouble(vars.get("stock_price")); // 从 JMeter 的魔法变量域中获取前一个请求中存储的股票价格变量
double buyPrice = Double.parseDouble(vars.get("user_buy_price")); // 获取用户设定的买入价格变量
if (stockPrice <= buyPrice) {
    vars.put("shouldBuy", "true");
} else {
    vars.put("shouldBuy", "false");
}
  • 这段代码就像一个聪明的小精灵助手,它首先从 JMeter 的变量域中找到股票价格和用户买入价格变量,然后像一个精明的商人一样进行比较,如果股票价格小于等于买入价格,就把 “shouldBuy” 变量设置为 “true”,否则设置为 “false”。这样,在后续的 If Controller 条件表达式中,就可以根据 “${shouldBuy}” 的值来决定是否执行买入股票的 HTTP 请求,就像根据市场行情和自己的预算来决定是否购买商品一样,实现了复杂业务逻辑下的变量动态设置和条件判断,让我们的测试更加智能和灵活。
  1. 变量作用域的魔法边界
    • JMeter 中的变量有不同的作用域,就像魔法世界里有不同的领地。全局变量就像是一个公共的魔法广场,在整个测试计划中都能被访问和使用,所有的元件都可以在这里找到需要的变量信息。而局部变量则像是一个小小的魔法房间,通常只在特定的元件或范围内有效。例如,在一个包含多个线程组的测试计划中,如果在一个线程组中通过 “用户定义的变量” 元件设置了一个全局变量 “${globalVariable}”,那么在其他线程组中也可以像在公共广场上一样访问和使用这个变量。然而,如果在一个 BeanShell Sampler 中定义了一个局部变量,如上述股票交易系统示例中的 “stockPrice” 和 “buyPrice” 变量,它们就只能在这个 BeanShell Sampler 的小魔法房间里活动,无法在其他元件中直接访问,就像房间里的秘密物品,只有在这个房间里才能使用。在使用 If Controller 进行条件判断时,我们要时刻注意变量的作用域,就像在魔法世界里要清楚每个领地的规则,确保使用的变量值是正确的,并且符合预期的作用域范围。如果不小心使用了错误作用域的变量,就可能会导致条件判断出错,就像在错误的领地使用了不合适的魔法物品,会引发意想不到的后果,从而影响测试结果的准确性,让我们的测试陷入混乱的魔法漩涡。

六、运行测试 —— 开启魔法之旅

当我们把 If Controller 和它的小伙伴们(各种测试元件和变量)都配置好后,就可以点击 JMeter 界面上的 “启动” 按钮(那个绿色的三角形图标,就像一个开启魔法大门的钥匙),让整个测试计划开始运行。这时候,If Controller 就会像一个严格的魔法指挥官,根据我们设定的条件表达式结果,决定哪些子节点元件要执行,哪些要跳过,就像指挥一场精彩的魔法交响乐,每个乐器(测试元件)都在合适的时机奏响,共同演绎出完美的测试乐章,准确地模拟各种实际使用场景下系统的行为,让我们能够发现系统中可能存在的问题,就像在魔法世界里找出隐藏的魔法陷阱,确保系统的稳定性和可靠性。

七、查看结果 —— 解读魔法的秘密语言

  1. 为了了解我们的魔法测试进行得怎么样,我们可以添加 “查看结果树” 监听器(右键点击线程组 - > 添加 - > 监听器 - > 查看结果树),这就像是打开了一本记录魔法测试过程的魔法书,里面详细记载了测试过程中的各种信息。
  2. 在 “查看结果树” 中,我们可以清楚地看到 If Controller 的执行情况以及它的子节点的执行结果。如果条件满足并且 HTTP 请求成功,我们会看到像宝藏一样的请求和响应信息,包括请求的 URL、返回的状态码、响应数据等,这些信息就像魔法咒语的反馈,告诉我们魔法是否生效,系统是否按照我们的预期工作。如果条件不满足,我们会看到 If Controller 像一个谨慎的卫士一样跳过某些操作的记录,这也能帮助我们快速定位测试过程中的问题,就像根据魔法书上的线索找到魔法失败的原因,验证测试是否按照我们设定的条件和流程进行,确保测试的准确性和可靠性,让我们的测试之旅更加顺利和有成效。
  3. 再次回顾调试魔法咒语的小窍门
    • 当我们在测试过程中遇到问题,比如某个条件表达式没有按照预期工作,导致测试结果不符合我们的期望时,不要慌张。我们可以再次请出 “调试采样器” 这个得力小助手。通过它,我们可以像解开魔法谜题一样,查看条件表达式中各个变量的实际值以及整个表达式的求值过程,就像找到魔法阵的关键节点。

http://www.kler.cn/a/465221.html

相关文章:

  • 在arm平台Euler系统上编译安装ffmpeg
  • Flask 快速入门
  • 让私域用户付费的三个关键要素
  • 认识一下,轻量消息推送 Server-Sent Events
  • 【信息系统项目管理师】高分论文:论信息系统项目的风险管理(数字化联合审查管理系统)
  • Mac M2基于MySQL 8.4.3搭建(伪)主从集群
  • 《Vue3实战教程》32:Vue3工具链
  • 《从入门到精通:蓝桥杯编程大赛知识点全攻略》(一)-递归实现指数型枚举、递归实现排列型枚举
  • 数据挖掘——概论
  • Mono里运行C#脚本20—mono_assembly_load_corlib
  • 论文阅读:Fine-Grained Recognition With Learnable Semantic Data Augmentation
  • Python之Web开发
  • mysql 事物隔离级别 与mvcc
  • Redis篇-Redis的基本使用命令(二)
  • 四种线程池的创建及任务提交
  • C# 设计模式(结构型模式):代理模式
  • 计算机网络——期末复习(5)期末试卷样例(含答案)
  • CSS 中 content换行符实现打点 loading 正在加载中的效果
  • Java学习,目录是否为空
  • PyTorch到C++再到 CUDA 的调用链(C++ ATen 层) :以torch._amp_update_scale_调用为例
  • 初学stm32 --- IO口模拟8080驱动LCD屏
  • 1 数据库(终):数据库管理员(数据可的备份与、DCL_管理用户)
  • STLG_01_05_程序设计C语言 - 数据类型概念解析
  • QT:控件属性及常用控件(1)------核心控件及属性
  • FortiAl为擎重塑网络与安全运营未来
  • k8s基础(1)—Kubernetes-Pod