玩转 JMeter 逻辑控制器,逻辑控制器初体验

140 阅读7分钟

在性能测试的江湖里,JMeter 可是一把 “神器”,而其中的逻辑控制器更是这把神器的 “秘密武器”。今天,咱就唠唠这些厉害的逻辑控制器,让你轻松掌握 JMeter 的精髓,在性能测试的战场上 “大杀四方”!

image.png

一、If 控制器 —— 测试里的 “智能开关”

咱就说,这 If 控制器就像是一个智能的小管家,根据条件来决定哪些元件该干活,哪些元件该歇着。比如说,你想看看不同用户等级能享受啥不同待遇,像 VIP 用户是不是能走特殊通道获取专属优惠呢?这时候就可以用 If 控制器啦。先设定好一个变量,像${user_type},如果它的值是 “VIP”,那就让优惠计算接口的取样器开始工作,后面再跟上断言,看看这优惠算得对不对。要是普通用户呢,就直接跳过这一步,是不是很智能?操作也不难,在线程组下面加个用户定义变量元件,把${user_type}的值设好,然后把 If 控制器请来,在它的条件表达式那儿写上${user_type} == "VIP",再把优惠计算接口的取样器和断言放在里面,齐活!

二、Transaction 控制器 —— 事务 “打包侠”

这个 Transaction 控制器可厉害啦,它能把一堆取样器打包成一个事务,就像把零散的东西装进一个大盒子里,这样统计性能指标就方便多啦。比如说在线银行转账这个事儿,登录、输入转账信息、确认转账,这几个步骤一个都不能少,少了任何一个,这转账事儿都办不成,对吧?把这些步骤对应的取样器都放在 Transaction 控制器下面,给它起个名字叫 “转账事务”。在登录前加个 HTTP Cookie 管理器,保证登录顺顺利利的;在确认转账后加个断言,看看转账到底成没成功。这样,在聚合报告里就能清楚地看到整个转账事务的性能情况啦,平均响应时间、吞吐量、错误率啥的,一目了然。要是发现平均响应时间太长,那就得好好检查检查每个步骤是不是有问题,或者是不是业务逻辑太复杂,得优化优化。

三、Loop 控制器 —— 勤劳的 “循环小蜜蜂”

Loop 控制器就像一只勤劳的小蜜蜂,不停地重复做一件事儿。比如说要测试文件上传接口,想看看它能不能经得住多次上传的考验,就把文件上传取样器放在 Loop 控制器下面,让它循环 10 次。这还不算完,在上传取样器前加个 CSV Data Set Config,从 CSV 文件里读取不同的文件路径和名字,这样每次循环上传的文件都不一样,更接近真实情况。在外面加个聚合报告监听器,看看这 10 次上传的平均响应时间、吞吐量和错误率,就能知道这个接口稳不稳啦。要是错误率高,那就得找找是不是文件格式有问题,或者是接口本身有漏洞。

四、While 控制器 —— 执着的 “循环守护者”

While 控制器有点像一个执着的守护者,只要条件满足,就会一直让取样器工作。比如说在消息推送系统里,只要消息队列里还有没推送的消息,就得一直推送。这时候就可以用 While 控制器啦,通过一个变量${messages_left}来判断消息有没有推完。每次推送完,用正则表达式提取器从响应里把剩下消息的数量提取出来,更新${messages_left}的值,然后继续循环。再加上一个计数器元件,记录循环了多少次,这样在测试报告里就能看到消息推送了几轮,是不是很方便?要是发现循环次数太多或者太少,那就得看看是不是消息处理的逻辑有问题,或者是消息源出了啥状况。

五、ForEach 控制器 —— 高效的 “遍历小能手”

ForEach 控制器是个高效的遍历高手,能把变量列表里的元素一个一个拿出来,让取样器对每个元素都操作一遍。比如说要测试批量查询用户信息的功能,用户 ID 都在 CSV 文件里存着。先把 CSV Data Set Config 安排上,设置好用户 ID 变量${user_id}。然后把 ForEach 控制器请出来,设置好输入变量前缀是 “user_id”,开始索引是 1,结束索引是用户的实际数量,输出变量名称是${current_user_id}。在 ForEach 控制器里面加上 HTTP 请求取样器,用${current_user_id}作为参数去查询每个用户的信息,这样就能快速地测试完所有用户的信息查询功能啦。要是查询结果不对,那就得看看是不是查询语句有问题,或者是用户数据本身有异常。

六、Include 控制器 —— 测试计划的 “拼图大师”

Include 控制器就像一个拼图大师,能把外部的测试片段拼接到当前的测试计划里,大大提高了测试计划的复用性。比如说在一个大型电商系统里,好多业务流程都得先登录,这登录的测试计划要是每次都重新写,那可太麻烦了。把登录的完整测试计划封装好,然后在其他业务流程的测试计划里用 Include 控制器把它包含进来,就像拼拼图一样简单。要是登录流程改了,只需要修改被包含的登录测试计划就行,其他地方都不用动,是不是很方便?不过在使用的时候,要注意被包含的测试计划里的元件命名和变量定义,可别和当前计划冲突了,不然就乱套啦。

七、Runtime 控制器 —— 时间的 “精准掌控者”

Runtime 控制器是时间的掌控者,能精确地控制取样器的执行时间。比如说要对新上线的促销活动接口进行高并发性能测试,就把促销活动的 HTTP 请求取样器放在 Runtime 控制器里面,设置运行时间为 300 秒(5 分钟)。再把线程组的线程数设高一点,比如 1000 个线程,循环次数设为 10 次,模拟高并发情况。同时在线程组下面加个同步定时器,让一定数量的线程同时发送请求,更真实地模拟用户行为。在这 5 分钟里,通过聚合报告监听器收集性能数据,看看这个接口在短时间高流量下的表现怎么样。要是发现响应时间太长或者错误率太高,那就得赶紧优化优化,不然促销活动的时候用户体验可就差了。

八、Critical Section 控制器 —— 数据的 “安全卫士”

Critical Section 控制器是数据的安全卫士,在多线程环境下,能保证同一时刻只有一个线程能执行它里面的取样器,避免数据被搞乱。比如说在电商系统里,好多用户同时更新商品库存,如果没有这个安全卫士,那就可能出现超卖的情况,库存数据就乱套了。把库存更新取样器放在 Critical Section 控制器下面,就算有 100 个线程同时来更新库存,也能保证每次只有一个线程能进去更新,数据就不会出错啦。不过在使用的时候,要设置好线程组的线程数量和循环次数,多测试几次,看看库存数据是不是准确无误。要是发现数据还是不对,那就得看看是不是还有其他地方在偷偷修改库存数据,得把这些 “小虫子” 找出来。

九、Interleave 控制器 —— 公平的 “轮流执行者”

Interleave 控制器是个公平的轮流执行者,能让内部的子元件按照一定顺序轮流工作,每个元件都有机会被执行到。比如说在测试多个支付渠道的性能时,把微信支付、支付宝支付、银行卡支付对应的取样器放在 Interleave 控制器下面,每次循环就会换一个支付渠道来测试,保证每个渠道都能被公平地测试到。在外面加个计数器元件,记录一下每个支付渠道被测试的次数,再在每个支付渠道的取样器后面加上断言,看看支付请求的响应是不是符合预期,有没有支付成功或者失败的提示信息。这样就能全面地评估每个支付渠道的性能和正确性啦。要是发现某个支付渠道的错误率特别高,那就得重点检查这个渠道的配置和接口是不是有问题。

十、Once Only 控制器 —— 一次性 “任务达人”

Once Only 控制器是个一次性任务达人,不管是单线程还是多线程环境,它里面的子元件都只执行一次。比如说在测试一个复杂的企业级系统时,一开始需要加载配置文件、建立数据库连接等初始化操作,这些操作只需要做一次就行,做多了反而可能出问题。把这些初始化的取样器放在 Once Only 控制器下面,像加个 Java 请求取样器,在里面写代码建立数据库连接,连接成功后设置一个 JMeter 变量${database_connected}为 “true”。然后在后续的业务测试中,用 If 控制器判断${database_connected}的值,只有当数据库连接成功了,才执行业务测试的取样器,这样就能避免在数据库连接没成功的情况下做无用功,保证测试的准确性和稳定性。要是发现业务测试的取样器没执行,那就得看看是不是数据库连接出了问题,是不是${database_connected}的值没设置对。

十一、Recording 控制器 —— 脚本的 “收纳盒”

Recording 控制器就像一个收纳盒,在录制测试脚本的时候,能把录制到的取样器等元件都放在里面,方便整理和编辑。比如说要测试一个新开发的 Web 应用,用 JMeter 的代理服务器录制用户在应用里的操作,像页面浏览、表单提交啥的。先在测试计划里加上 HTTP (S) Test Script Recorder,配置好代理服务器的信息,把目标控制器选为 Recording 控制器。然后启动录制,在浏览器里一顿操作,录制完了,那些 HTTP 请求取样器就都在 Recording 控制器里了。这时候,就可以用正则表达式提取器从响应里提取关键数据,设成变量,供后续的请求参数或者断言使用,再加上断言验证页面的关键元素是不是存在,这样就能保证录制的脚本能准确地模拟用户行为,验证页面的正确性啦。要是录制的脚本执行起来有问题,那就得检查检查提取的变量是不是对,断言设置得合不合理。

十二、Simple 控制器 —— 测试计划的 “收纳小助手”

Simple 控制器就是一个收纳小助手,能把相关的取样器和断言等元件放在一起,让测试计划看起来更清晰。比如说在测试一个大型系统的多个功能模块时,把用户注册模块、用户登录模块、商品搜索模块等相关的元件分别放在不同的 Simple 控制器下面,并且给它们起个好记的名字。在用户注册模块的 Simple 控制器里,放上注册页面的请求取样器、注册信息提交的取样器和断言,看看注册是不是成功了;在用户登录模块的 Simple 控制器里,放上登录页面的请求和登录操作的取样器以及断言,看看登录有没有问题;在商品搜索模块的 Simple 控制器里,放上搜索页面的请求取样器和搜索结果处理的取样器等等。这样,在测试的时候,如果某个模块出了问题,就能很快地找到对应的 Simple 控制器,查看里面的元件是不是有问题,是不是配置错了。

十三、Random 控制器 —— 测试的 “幸运大转盘”

Random 控制器就像一个幸运大转盘,每次执行的时候,会随机选择一个子元件来运行,充满了惊喜和不确定性。比如说在测试一个有多种广告展示方式的网站性能时,把不同广告展示接口对应的取样器放在 Random 控制器下面,每次执行就像转动大转盘一样,随机选一个广告展示取样器来测试,模拟用户随机看到不同广告的情况。还可以结合 JMeter 的 Random Variable 配置元件,生成一个 1 到 100 的随机数,当随机数在 1 到 30 之间时,更倾向于选择某个特定的高优先级广告展示取样器;当随机数在 31 到 100 之间时,就在其他广告展示取样器中随机选择,这样就能更灵活地控制广告展示的概率,让测试更接近真实情况。要是发现某个广告展示的频率不符合预期,那就得检查检查 Random Variable 的设置是不是对,或者是 Random 控制器的配置有没有问题。

十四、Random Order 控制器 —— 测试的 “随机舞者”

Random Order 控制器就像一个随机舞者,会让内部的子元件按照随机的顺序跳舞,每个元件都有机会在不同的顺序下被执行。比如说在测试电商系统的购物流程时,把商品搜索、添加购物车、结算等步骤对应的取样器放在 Random Order 控制器下面,每次循环就会以随机的顺序执行这些步骤,模拟用户随意的购物行为。在每个取样器后面加上断言,看看每个步骤是不是都执行成功了,再加上一个计数器元件,记录购物流程的执行次数,这样就能统计出不同随机顺序下购物流程的平均性能指标,比如平均响应时间、错误率等,看看这个电商系统的购物流程在各种随机情况下是不是都能稳定运行。要是发现某个顺序下的错误率特别高,那就得重点检查这个顺序下的取样器和业务逻辑是不是有问题。

十五、Throughput 控制器 —— 负载的 “调节器”

Throughput 控制器是负载的调节器,能控制内部子元件的执行频率,模拟不同的负载情况。比如说在测试一个 API 接口时,通过它设置低负载(每秒执行 1 次请求)、中负载(每秒执行 3 次请求)和高负载(每秒执行 10 次请求),看看接口在不同负载下的表现。在聚合报告监听器里,能清楚地看到不同吞吐量设置下的平均响应时间、吞吐量数值以及错误率的变化情况。如果在高负载下发现响应时间太长或者错误率升高,那就说明这个 API 接口可能有点 “吃不消” 了,得赶紧优化优化,比如优化数据库查询语句,让它跑得更快;或者增加服务器资源,给它加点 “马力”;或者优化代码逻辑,让它更高效地工作。可以多调整几次 Throughput 控制器的吞吐量设置,结合服务器资源的监控,像 CPU、内存、网络带宽这些指标,看看系统的瓶颈在哪里,然后有针对性地进行优化,让这个 API 接口在各种负载下都能表现出色。

十六、Switch 控制器 —— 测试的 “智能导航”

Switch 控制器就像一个智能导航,能根据索引值或表达式的结果,把测试引导到不同的方向,选择执行特定的子元件。比如说在测试一个有多种语言版本的 Web 应用时,把中文、英文、日文等不同语言版本对应的页面访问取样器放在 Switch 控制器下面,通过一个变量${language_index}来决定走哪条路。假设${language_index}的值为 0 表示中文,1 表示英文,2 表示日文,就在 Switch 控制器的配置里设置表达式为${language_index},然后根据这个值选择对应的语言版本取样器来测试。还可以在测试计划里加个用户定义变量元件,让用户在测试前选择要测试的语言版本,通过设置${language_index}的值来控制 Switch 控制器的执行路径,这样测试就更灵活,能满足不同的需求。要是发现 Switch 控制器没有按照预期选择取样器,那就得检查检查${language_index}的值是不是对,或者是 Switch 控制器的配置有没有问题。

十七、Module 控制器 —— 测试计划的 “模块魔法师”

Module 控制器是测试计划的模块魔法师,能在不同的测试计划之间灵活地共享和复用单个模块或部分元件,就像变魔术一样神奇。比如说在一个大型电商项目里,好多业务流程都需要用到商品搜索功能模块。把商品搜索功能相关的元件整理好,放在一个独立的测试计划里,就像把魔法道具放在一个魔法盒子里。然后在其他业务流程的测试计划中,用 Module 控制器把这个商品搜索模块引用过来,比如在用户购物流程测试计划、商家管理流程测试计划中都可以引用。这样,当商品搜索功能需要改进时,只需要在独立的测试计划里修改相关元件,其他使用这个模块的测试计划就会自动更新,不用一个一个地去改,大大提高了测试计划的维护性和复用性。在使用 Module 控制器的时候,要注意把引用的模块元件命名和配置得通用一些,这样在不同的测试计划里才能更好地适配。要是引用的模块出现问题,那就得检查检查是不是在原始的独立测试计划里修改了不兼容的内容,或者是在引用的时候设置错了参数。

总之,这些 JMeter 的逻辑控制器各有各的神通,只要掌握了它们,就能在性能测试的世界里游刃有余,轻松发现系统的性能问题,让系统变得更加稳定和高效。怎么样,是不是觉得很有趣呢?赶紧动手试试吧!