当前位置: 首页 > 科技观察

Jmeter各种线程组详解

时间:2023-03-14 01:16:48 科技观察

了解JMeter的朋友都知道,它不仅可以做简单的接口测试,还支持性能测试。接口类型不仅支持Rest、SOAP,还可以扩展WebSocket、Socket等。不管你用Jmeter做什么样的测试,哪种接口类型,哪种网络协议,都必须添加和使用Jmeter线程组,线程组占用在Jmeter中占据主导地位,它是任何测试计划的起点,所有的逻辑控制设备、采样器、处理器、报告等都必须放在线程组下,也就是说如果你使用Jmeter进行接口测试或者性能测试,那么线程组是必不可少的。本文分三个方面介绍Jmeter的线程组,主要从三个方面:线程组介绍、线程组设置、线程组分类。1.线程组简介线程组元素是任何测试计划的起点。测试计划中的所有组件都必须在某个线程组下。所有任务都基于线程组:通俗理解:线程组:一个线程组,里面有若干个请求;线程:线程是一个“虚拟用户”;request:一个包含多个请求的线程组。对应:比如:一个线程组有10个请求,线程数为10,运行后得到:明白:(10个线程)10个人,每个人都要跑这10个请求,所以:10*10=100:并发数:100;线程数:10;PS:线程组也可以看作是一个虚拟用户组。线程组中的每个线程都可以理解为一个虚拟用户。2.线程组设置我们把线程组设置分为3个区域:区域1:sampler失败后怎么办(LoadRunner也有类似的操作设置选项,对比学习)1.Continue:继续执行下一个操作;2.StartNextThreadLoop:开始下一个循环;3.stopThread:停止线程,退出线程(不执行本线程的操作);4.stopTest:等待当前执行的sampler结束,然后结束整个Test;5.StopTestNow:立即停止测试。区域二:线程属性1.NumberofThreads(users):线程数,相当于模拟用户数;2.Ramp-upPeriod(inseconds):达到指定线程所需的时间,例如线程数为100,时间设置如果设置为10s,则10s加载100个线程,则每秒启动的线程数=100/10=10;3.LoopCount:如果填写具体值,就是对应的循环次数;如果选择“Forever”,它将一直执行直到被手动停止;4.DelayThreadcreationuntilneeded:延迟线程创建直到需要。区域三:调度器配置需要选择调度器,调度器配置才会生效。【示例】现用普通线程组测试一个简单的http接口测试,测试前添加并设置线程组及其他组件:第一步:添加线程组,添加后选择sampler。是由于接口、消息或外部原因导致接口执行错误后的一种后期行为。对于每个选项,再选择一个。目前我选择接口执行出错后继续执行。第二步:因为不是性能测试,线程组可以设置为1,即单个“虚拟用户”。第三步:关于scheduler配置不同版本的Jmeter会有不同的变化。目前的Jmeter版本V5.1.1调度器配置在原有基础上易于理解和执行。使用调度器前,需要先“打开”调用按钮(点击勾选),根据功能提示选择界面的启动延迟时间和时长。注意:使用调度器后,中间周期数无效。第四步:添加http请求并设置域名、路径等并填写请求信息;(添加路径:线程组→添加→采样器→HTTP请求)第五步:添加HTTP信息头管理器,用于存储请求头部分,写入接口对应的请求头部分:(添加路径:线程组→添加→配置原件→HTTP信息头管理器)最后可以添加查看结果树,然后点击运行就可以看到结果了!(添加路径:线程组→添加→监听器→查看结果树)3.线程组分类从系统的角度来看,Jmeter的线程组主要分为系统原生线程组和可扩展线程组。带有调度器、定时器、前处理器和后处理器、逻辑控制器等的原生线程组已经可以满足大部分测试的需求,但是如果需要多维度设计并发用户数,原生线程组已经不能满足了要求。此时,我们可以添加插件的线程组,使其更加强大,并且可以自定义多种场景等功能,更贴近真实用户的使用场景。(一)原生线程组1、线程组(threadgroup)这是我们平时添加运行的线程。一般来说,一个线程组可以看作是一个虚拟用户组,线程组中的每一个线程都可以理解为一个虚拟用户。上面使用的例子就是这个线程组。2.设置线程组(setupthreadgroup)一种特殊类型的ThreadGroup,可以用来执行预测试操作。这些线程的行为与普通线程组元素完全一样。不同的是,这些类型的线程在执行测试前会进行常规的线程组执行;与LoadRunner的init类似,在测试开始时进行初始化工作。区别在于执行顺序——它将在正常线程组执行之前被触发。应用场景示例:A、测试数据库操作函数时,用于执行打开数据库连接的操作。B、测试用户购物功能时,用于进行用户注册、登录等操作。3.teardown线程组(disconnectinggroup)一种特殊类型的ThreadGroup,可以用来执行后期测试动作。这些线程的行为与普通线程组元素完全一样。不同的是,这些类型的线程在测试结束后执行周期性的线程组;与LoadRunnner的结束类似,在测试结束时进行回收工作。不同的是执行顺序——它会在正常的线程组执行之后被触发。应用场景示例:A、测试数据库操作函数时,用于执行关闭数据库连接的操作。B、测试用户购物功能时,用于执行用户退出等操作。(二)可扩展线程组1.ConcurrencyThreadGroup(增量并发线程组)可以模拟增量并发(只增量不减量),可以设置增量个数,增量持续时间,达到目标增量个数的保留时间,etc.:参数说明:TargetConcurrency:目标并发数(总线程数)RampUpTime:加速时间(总加速时间)Ramp-UpStepsCount:加速步数(总加速/增量次数)HoldTargetRateTime:时间保持目标速率(达到线程总数后的持续时间)TimeUnit:时间单位(分钟或秒)ThreadIterationsLimit:线程迭代限制(循环次数)LogThreadsStatusintoFile:将线程状态记录到文件中(线程启动和线程停止事件保存为日志文件);现在设计这样一个场景:意思是:3分钟除以5步,每步0.6分钟;100个用户分为5步,每步20个用户;每0.6分钟将添加20个用户,直到达到100个用户,并且在达到100个线程后,所有这些线程将继续运行并一起访问服务器6分钟。2.SteppingThreadGroup(步进线程组)可以模仿增量并发(不仅可以增量还可以减量),可以设置增量个数,增量开始延时,增量时间,达到目标增量个数保持时间,等:参数说明:1.线程组最大用户数:1002.第一次加载用户前等待时间:10秒,此时没有用户进入3.第一次加载用户数:10用户开始4和5:加10every10secondsUser6.ramp-up几秒内启动线程组7.连续压测60秒一分钟8、9:退出用户,10个用户每10秒退出10.以上设置的图形表示3.bzm-ArrivalsThreadGroup(bzm-到达线程组)与ConcurrencyThreadGroup线程组有相似的功能。参数说明:TargetRate:目标线程数(线程总数)RampUpTime:需要多少加载时间(总加速时间)RampUpStepsCount:需要多少加载步数(总增量/加速次数)HoldTargetRateTime:持续运行时间(达到线程总数后的持续时间)TimeUnit:可以选择以分钟或秒为单位ThreaditerationsLimit:限制线程迭代次数。如果我们只需要为每个用户运行一次来??模拟实际用户行为,则可能会有用。在我们的例子中,这个字段是空的,所以每个用户都将运行不确定的迭代,直到计划结束。LogThreadStatusintoFile:将线程状态记录到文件中ConcurrencyLimit:最大并发限制。以避免内存不足的问题。在我们的例子中是1000,这是一个很大的数字。现在设计这样一个场景:所以上面的设置等于:3min除以5步,等于每步加速后0.6分钟,100个用户除以5步,等于每步加速20个用户,之后继续跑达到100个用户600万。4.线程UltimateThreadGroup(最终线程组)比较难理解,但是它的功能也比较强大。它支持在负载下对线程组进行复杂的管理。这是通过线程计划中的行数不受限制来实现的,这可以为线程组的不同部分启用不同的配置。这个插件有点类似于SteppingThreadGroup线程组,不过这是多个线程组设置的组合。在执行过程中,每个线程组同时按照自己的规则开始执行,每一个时刻,得到的结果都是两个线程组的叠加。形象比喻:并发用户就像一波又一波的浪潮涌入系统,拍打着服务器,考验着我们的系统是否能够承受压力,顺利运行。当我们的网站正常运行的时候,突然有1000个用户同时访问的一波,我们称之为第一波。访问30s后,第一波在15s内逐渐退出系统。在第一波退出系统的同时,第二波2000名用户在极短的时间内突然涌入网站,我们称之为第二波。进入30s后,第二波也在15s内逐渐退出系统。在第二波退出系统的同时,第三波3000用户突然涌入网站,我们称之为第三波。进入30s后,第三波也在15s内逐渐退出系统。在第三波退出系统的同时,第四波1000名用户突然涌入网站,我们称之为第四波。进入30s后,第四波也在15s内逐渐退出系统。添加单线程组Row和添加多线程组Row:参数说明:StartThreadsCount:启动的线程总数。图中,本次测试共启动了100个线程(用户/并发)。InitialDelay,sec:初始延迟时间,以秒为单位。设置为0,即点击立即执行。启动时间,秒:并发启动100个线程所需的总时间,以秒为单位。图中设置10秒(线程组的加速周期)HoldLoadFor,sec:保持加压时间,单位秒。图片中有10秒。关机时间:释放和关闭所有设备的时间,以秒为单位。图片中有10秒。【示例】1、需求:要求对该界面的用户访问进行分波。每个时期,每一波都有不同的用户访问量。每一波的用户访问都呈现先增后减的状态。wave用户最大并发数不能超过70。2、分析:根据需求实现具体场景,得出普通线程组无法实现。普通线程组一般实现为“线性”需求场景(与其他组件实现略有不同),那么UltimateThreadGroup线程组此时可以实现:3.步骤:第1步:根据需求场景“每periodandeverywavehasdifferentuseraccesses”,现在设置添加多个Rows,每个Row的StartThreadsCount(开始线程数),初始用户数为:10,30,50,70,50,30,10、此时每波用户的访问量增加→减少,单波用户的需求不能超过70以配合关闭时间已经满足。Step2:InitialDelay,sec(延迟启动时间,单位秒)每行设置间隔5s:0s、5s、10s、15s、20s、25s、30s,以满足不同组的启动延迟时间,如果每个线程组的不同用户在同一个时间节点启动,就不是增量并发,而是同步并发。Step3:StartupTime,sec(startuptime)ofeachRow,表示每个线程组的线程全部启动的秒数。目前设置为1s,即每个线程组中的线程数从开始到结束调用的持续时间为1秒。Step4:HoldLoadFor,sec(continuousoperation)ofeachRow,表示每个线程组的线程在开始达到设定的线程数后还要继续运行多长时间,单位秒。此时要求每组线程运行到峰值后会呈现“递减”状态,所以连续运行时间也要设置为递减:30、25、20、15、10、5、0(单位秒)。Step5:ShutwnTime(关机时间),这个可以和上面四个一起设置:0,5,10,15,10,5,0。这个是为了满足“增减用户数”的需求每波访问量”。main函数的配置已经完成。我们来看一下具体线程组的效果图:此时为了保证线程组运行后运行轨迹的变化,添加一个ActiveThreadsOverTime用于查看随时间变化的活跃线程:(添加路径:ThreadGroup→Add→Listener→jp@gc-ActiveThreadsOverTime)最后可以添加查看结果树、聚合报告、响应时间图等。分析本接口各接口的返回指标:UltimateThreadGroup(最终线程组)实现原理:TA有点类似于SteppingThreadGroup线程组,不过这是多个线程组设置的组合。在执行过程中,每个线程组同时按照自己的规则开始执行,每一个时刻,得到的结果都是两个线程组的叠加。综上所述,对于系统自带的Jmeter线程组,只需要下载安装并配置环境变量Jmeter即可使用。可扩展线程组需要下载特定的插件进行安装配置。虽然麻烦,但是配置的线程组比较强大,可以使用。满足各类用户和需求场景,感兴趣的朋友值得一试!【本文为栏目组织《AiChinaTech》原创文章,微信公众号(id:tech-AI)》】点此查看作者更多好文