宝子们,今天咱就来唠唠 JMeter 里超厉害的 Loop Controller(循环控制器),这可是咱做性能测试的秘密武器哦!
一、Loop Controller 是啥玩意儿?
Loop Controller 就像是一个指挥小能手,能让它下面的测试元件按照咱们设定的次数反复执行任务。比如说,你想看看一个网页被多次访问时服务器的表现,或者要对数据库查询操作来个 “车轮战”,它都能轻松搞定,这样咱就能更精准地知道系统在不同压力下的性能咋样啦。
不过要注意哦,如果把循环次数设成 “0”,那它下面的元件就直接 “躺平”,啥也不干。要是你选了 “Forever(永远循环)” 这个选项,可得小心啦!特别是在高负载测试的时候,它可能会像个贪吃蛇一样,把 CPU、内存这些资源吃得死死的,搞不好测试还停不下来。所以用这个选项的时候,一定要配上监控手段,像给测试设个固定的持续时间,这样才能保证测试稳稳当当,不 “翻车”。
二、基础操作咋弄?
(一)添加 Loop Controller
- 首先,在 JMeter 测试计划里,得先搞个线程组出来。这就好比搭个舞台,演员(测试元件)才能在上面表演。操作就是右键点击 “测试计划”,然后选 “添加”→“Threads (线程)”→“线程组”。
- 接着,选中刚建好的线程组,再右键点击,选 “添加”→“逻辑控制器”→“Loop Controller”。这时候,你就能在 JMeter 界面的测试计划树里看到新冒出来的 Loop Controller 啦。
(二)设置循环次数
添加好 Loop Controller 后,在右边的 “Loop Controller” 配置面板上,有个 “循环次数” 的设置项。这里可不光能填个固定的数字,还能用 JMeter 的变量或函数来让循环次数变得更灵活。比如说,提前定义一个用户变量 “loopCount”,然后在 “循环次数” 的框里写上 “${loopCount}”,这样循环次数就能跟着变量值变来变去,就像孙悟空的金箍棒一样,可长可短,测试计划也变得更聪明、更能适应不同情况啦。\
三、实际咋用呢?看例子!
(一)多次访问网页(多次执行 HTTP 请求)
假设咱要给一个新闻列表页面来个 “压力测试”,看看它被多次刷新时服务器会不会 “顶不住”。
- 在 Loop Controller 下面加一个 HTTP 请求。操作就是右键点击 “Loop Controller”,然后选 “添加”→“Sampler”→“HTTP 请求”。
- 在 HTTP 请求里,把要访问的新闻列表页面的 URL(比如 “example.com/news/list”)和请求方法(像 “GET”)这些信息填好,得保证能顺利拿到新闻列表数据哦。
- 把 Loop Controller 的循环次数设成 “10”。当然啦,你可以根据实际情况改成其他合适的数字,或者用变量来动态控制。这就意味着这个新闻列表页面会被访问 10 次,就像有 10 个不同的用户在不停地刷新页面。通过这种方式,我们就能把每次请求的响应时间、状态码这些数据都收集起来,看看服务器在被多次 “骚扰” 时的性能表现咋样。
(二)用不同参数测试登录接口(结合参数化进行多次不同参数的测试)
比如说要测试一个登录接口是不是够 “强壮”,能不能应对不同用户的登录。
- 先准备一个 CSV 文件,里面写上多组用户名和密码,每行像这样 “username,password”,比如:
user1,password1
user2,password2
user3,password3
- 在测试计划里加一个 “CSV 数据文件设置” 配置元件。右键点击 “测试计划”,选 “添加”→“配置元件”→“CSV 数据文件设置”,然后把 CSV 文件的路径、变量名(像 “username” 和 “password”)这些参数都配置好,这样 JMeter 才能顺利从文件里读取数据,然后把它们当成测试参数传给登录请求。\
- 在 Loop Controller 下面加一个 HTTP 请求来模拟登录操作。在 HTTP 请求的 “参数” 选项卡那里,把用户名和密码参数设成从 CSV 文件里读出来的变量,也就是 “username” 和 “password”。这样每次循环的时候,HTTP 请求就会用 CSV 文件里不同的用户名和密码组合去登录,看看这个登录接口是不是能 “百毒不侵”。
这里要注意哦,当循环次数比 CSV 文件里的行数还多时,JMeter 会咋办呢?这就取决于 “CSV 数据文件设置” 里的 “允许变量值循环使用” 选项:
- 如果勾选了这个选项,JMeter 就会像个勤劳的小蜜蜂,不停地循环使用 CSV 文件里的数据,直到完成设定的循环次数。比如说循环次数设成 5,而 CSV 文件里只有 3 行数据,JMeter 会先把前 3 行数据用一遍,然后又从第一行开始用,一直到完成 5 次循环。
- 要是没勾选这个选项,当 CSV 文件里的数据用完了,JMeter 可能就会 “发脾气” 报错啦。不过具体报啥错,还得看测试元件的配置和 JMeter 的运行模式。
所以在实际测试的时候,宝子们得根据测试需求和数据情况,好好设置循环次数,还要注意参数咋用,这样才能保证测试结果准准确确的,不闹笑话。
(三)复杂场景:多个控制器嵌套(复杂场景示例:嵌套多个控制器模拟复杂场景)
比如说,我们可以在 Loop Controller 里面再塞一个 While Controller(右键点击 “Loop Controller”→“添加”→“逻辑控制器”→“While Controller”)。然后给 While Controller 设置一个条件表达式(像 “{__jexl3(${count} < 5)}”,这里的 “count” 是一个我们自己定义的变量,一开始设成 0,然后在每次循环里让它增加),这样就能实现只有满足特定条件的时候,才会执行 While Controller 里面的测试元件。这种嵌套的玩法就像俄罗斯套娃一样,可以创造出超级复杂的测试逻辑,模拟出实际应用里可能遇到的各种奇葩情况,比如根据服务器响应里的某个值来决定是不是要继续后面的操作。
下面看一个例子,假设线程组循环次数是 3,Loop Controller 循环次数是 4,While Controller 的条件是 “{__jexl3(${count} < 3)}”(count 变量在每次 Loop Controller 循环里都会增加):
- 首先,线程组里的所有元件(包括嵌套的控制器和它们下面的测试元件)会完整地跑 3 次,这就是线程组循环的作用,就像一场戏要演 3 遍。
- 在每次线程组循环的时候,Loop Controller 下面的元件会循环 4 次。而对于 While Controller 呢,在每次 Loop Controller 循环的时候,它会先看看条件满不满足,如果满足(也就是 count 小于 3),就会执行里面的测试元件;当 count 达到 3 的时候,While Controller 里面的测试元件就会 “歇着”,直到下一次 Loop Controller 循环开始,又把 count 变量重置,重新来过。
这种多层嵌套的循环结构就像一个精心设计的迷宫,可以更真实地模拟出实际生活中用户那些复杂的行为,比如用户在不同时间段对系统关键功能的多次使用,这样就能更全面地评估系统的性能和稳定性,看看这个系统是不是经得起 “折腾”。在设置这种复杂场景的时候,宝子们可得仔细想好每个控制器的循环次数、条件表达式还有变量咋设置,得保证测试场景和我们预期的业务逻辑、性能测试需求完美匹配,不然就会 “差之毫厘,谬以千里” 啦。
四、Loop Controller 常和谁一起 “玩耍”?
(一)HTTP 请求采样器(HTTP Request Sampler)
- 啥时候用
- 在测试 Web 应用的性能时,Loop Controller 和 HTTP 请求采样器这对组合可太常用了。比如说要测试一个电商网站的产品详情页面的性能,把 HTTP 请求采样器放在 Loop Controller 下面,通过设置循环次数,就能模拟出好多用户不停地访问这个页面,然后我们就能收集像响应时间、吞吐量这些性能指标,看看这个页面在不同的访问频率下是不是还能 “稳如泰山”。
- 咋配置
- 在 Loop Controller 下面加了 HTTP 请求采样器后,得在 HTTP 请求采样器里把请求信息填对。像协议(是 HTTP 还是 HTTPS)、服务器名称或 IP、端口号、路径这些都不能马虎。比如说测试一个电商网站产品详情页,协议是 “HTTP”,服务器名称是 “www.example - ecom.com”,端口号是 “80”,路径是 “/product - details/12345”(假设产品 ID 是 12345 的详情页),这些信息都得像 “对密码” 一样准确无误,不然测试就会 “找不着北”。
(二)CSV 数据文件设置(CSV Data Set Config)
- 啥时候用
- 这种组合在参数化测试里经常出现。比如测试一个登录接口,准备一个有好多组用户名和密码的 CSV 文件。通过 CSV 数据文件设置把这些参数读出来,然后在 Loop Controller 的每次循环里,把不同的用户名和密码组合传给 HTTP 请求采样器(用来登录),这样就能对登录功能进行多组参数测试,看看这个登录接口是不是能应对各种 “密码攻击”,保证系统在不同用户登录的时候都能正常工作。
- 咋配置
- 在测试计划里加一个 CSV 数据文件设置组件,把 CSV 文件的路径、变量名(像用户名变量 “username”,密码变量 “password”)、分隔符(一般是逗号)这些参数都配置好。然后在 Loop Controller 下面的 HTTP 请求采样器里,把请求参数(比如登录接口的用户名和密码字段)设成从 CSV 数据文件设置里读出来的变量,也就是 “和{password}”,这样就能让用户名和密码像变魔术一样,每次循环都不一样。
(三)While Controller
- 啥时候用
- 当我们要根据某个条件来决定是不是继续循环的时候,Loop Controller 和 While Controller 这对组合就派上用场了。比如说测试一个文件下载功能,我们设一个变量来记录已经下载文件的大小,把下载文件的 HTTP 请求采样器放在 While Controller 里面,While Controller 再放在 Loop Controller 下面。通过设置 While Controller 的条件表达式(像 “{__jexl3({downloadedSize}<${fileSize})}”,这里 “downloadedSize” 是已下载大小变量,“fileSize” 是文件总大小变量),就能实现在文件还没下载完的时候,在 Loop Controller 的每次循环里继续尝试下载,直到文件下载完成或者达到 Loop Controller 的循环次数限制,就像一个执着的小蚂蚁,不把食物搬完不罢休。
- 咋配置
- 在 Loop Controller 下面加 While Controller,然后在 While Controller 的配置面板里设置条件表达式。这个条件表达式可以用 JMeter 的函数和变量,像 “__jexl3” 函数就能帮我们处理复杂的逻辑判断。同时,还得在测试计划的其他地方(比如前置处理器或者用户定义变量)把条件表达式里用的变量初始化好,并且在循环过程中更新它们,不然这个条件表达式就会 “晕头转向”,不知道该咋办啦。
(四)用户定义变量(User Defined Variables)
- 啥时候用
- 用来设置一些在 Loop Controller 多次循环里可能会用到的公共变量。比如说测试一个有好多接口的系统,我们需要设一个公共的服务器地址变量。通过用户定义变量组件定义一个叫 “serverAddress” 的变量,值设成 “www.example - api.com”,然后在 Loop Controller 下面的多个 HTTP 请求采样器里,把服务器地址字段都设成 “${serverAddress}”,这样以后要是服务器地址变了,我们只需要在用户定义变量这里改一次,不用一个一个地去改 HTTP 请求采样器的配置,是不是很方便?就像有了一把万能钥匙,能打开好多把锁,大大提高了测试计划的可维护性,让我们的测试工作轻松不少。
- 咋配置
- 在测试计划里加用户定义变量组件,在它的配置面板里把变量名和变量值填好。然后在 Loop Controller 下面的相关测试元件(像 HTTP 请求采样器、JDBC 请求采样器等)里,用 “${变量名}” 的方式把这些变量引用过来,就像喊朋友的名字一样,把变量叫过来帮忙。
(五)聚合报告监听器(Aggregate Report Listener)
- 啥时候用
- 用来收集和展示 Loop Controller 多次循环后的性能数据汇总。比如说测试一个搜索引擎接口的性能,把 HTTP 请求采样器放在 Loop Controller 下面进行多次搜索请求,同时加上聚合报告监听器。等测试结束后,聚合报告监听器就会像一个小管家一样,把平均响应时间、吞吐量、错误率这些性能指标的汇总信息都展示出来,让我们能快速了解系统在多次循环测试后的整体性能表现,看看这个搜索引擎是不是够 “聪明”、够 “快”。
- 咋配置
- 在测试计划里加聚合报告监听器(右键点击测试计划→“添加”→“监听器”→“聚合报告”)。等 Loop Controller 完成循环测试后,点击聚合报告监听器,就能看到性能数据汇总啦。这里还可以根据自己的需要调整监听器的显示设置,比如显示的精度、排序方式这些,就像给数据穿上不同的衣服,让我们能更方便地查看和分析数据。
五、Loop Controller 和线程组循环有啥不一样?
线程组的循环次数就像是一场大戏的总场次,它决定了整个线程组(包括里面所有的测试元件)作为一个整体要重复表演多少次。比如说线程组循环次数设成 3,那就意味着线程组里的所有操作(像多个 HTTP 请求、数据库操作这些)都会完整地重复 3 次,就像一组演员把一场戏完整地演 3 遍。
而 Loop Controller 呢,它就像是一个小导演,只负责指挥它下面的测试元件循环表演,不会影响线程组里的其他元件。比如说在线程组下面有一个循环控制器,循环次数设成 4,而且循环控制器下面有一个 HTTP 请求,那么这个 HTTP 请求就会自己 “加演” 4 次,线程组里的其他元件就像没事人一样,该咋演咋演,不受这个循环的影响。
它们之间的关系可以用一个简单的公式来理解:“总执行次数 = 线程组循环次数 × Loop Controller 循环次数”。比如说线程组循环次数是 2,循环控制器循环次数是 5,那么这个循环控制器下面的测试元件总共会执行 2×5 = 10 次,而且这 10 次是分在 2 个线程组循环周期里完成的,循环控制器内部的循环就像一个独立的小世界,不受线程组循环进度的影响,始终按照自己设定的循环次数执行,是不是很神奇?
宝子们,学会了 JMeter 里的 Loop Controller,就像掌握了一把性能测试的金钥匙,能打开系统性能的神秘大门,让我们更好地优化系统,给用户带来更好的体验!赶紧去试试吧!