一、线程组介绍:
线程组元件是任何一个测试计划的开始点。在一个测试计划中的所有元件都必须在某个线程组下。所有的任务都是基于线程组:
通俗理解:
· 线程组:就是一个线程组,里面有若干个请求;
· 线程:一个线程就是一个“虚拟用户”;
· 请求:一个线程组里面有若干个请求。
对应关系:
例如:1个线程组里面有10个请求,线程数为10个,跑完后得到:
理解为:(10个线程数)10个人,每个人都要跑这10个请求,所以:10*10=100:
并发数:100;线程数:10;
PS:线程组也可以看作是一个虚拟用户组。线程组中的每一个线程都可以理解为一个虚拟用户。
二、线程组设置:
我们把线程组的设置分成3个区域:
区域一:采样器失败后处理:
参数解释:
1、continue(继续):继续执行接下来的操作;
2、Start Next Thread Loop(启动下一进程循环):开始下一次循环;
3、stop Thread(停止线程):停止线程,退出该线程(不再执行此线程的操作);
4、stop Test(停止测试):等待当前执行的采样器结束后,结束整个测试;
5、Stop Test Now(立即停止测试):马上停止测试;
区域二:线程属性:
参数解释:
1、Number of Threads(users)(线程数):相当于模拟的用户数量;
2、Ramp-up Period(in seconds):达到指定线程需要的时间,例如线程数为10,时间设定为5s,那么就是5s加载 10个线程,每秒启动的线程数=10/5=2;
3、Loop Count(循环次数):如果填具体的数值,就是循环对应的次数;如果选择“Forever”,则一直执行下去,直到手动停止;
4、Delay Thread creation until needed:延迟线程创建,直到需要才创建。
区域三:调度器配置:
需要选中调度器(scheduler),调度器配置才生效。
参数解释:
1、Duration(持续时间):设置测试计划的执行时间,单位是秒。
2、Startup delay(启动延迟):设置测试计划的启动延迟时间,以确保测试计划在指定的开始时间开始执行。
注意:
1、注意:调度器一般在循环次数为“永远”时配合使用,否则会按照具体的循环次数执行。
2、JMeter调度器只适用于JMeter的GUI模式(即通过JMeter界面直接执行脚本),不适用于CLI模式(即进入到Jmeter的bin目录下通过命令执行测试脚本)。
3、在CLI模式下,需要使用其他的方式来控制测试计划的执行时间和频率,例如使用脚本语言编写定时执行脚本来实现。
三、各类型线程组:
1、原生线程组:
(1)thread group(线程组):
这个就是我们通常添加运行的线程。通俗来讲一个线程组,可以看做一个虚拟用户组,线程组中的每个线程都可以理解为一个虚拟用户。上文所介绍使用的例子就是此线程组。
(2)setup thread group(前置线程组):
一种特殊类型的ThreadGroup的,可用于执行预测试操作。这些线程的行为完全像一个正常的线程组元件。不同的是,这些类型的线程执行测试前进行定期线程组的执行;类似LoadRunner的init,测试开始时进行初始化的工作。
不同的是执行顺序---它会在普通线程组执行之前被触发。
应用场景举例:
A、测试数据库操作功能时,用于执行打开数据库连接的操作。
B、测试用户购物功能时,用于执行用户的注册、登录等操作。
(3)teardown thread group(拆线组):
一种特殊类型的ThreadGroup的,可用于执行测试后动作。这些线程的行为完全像一个正常的线程组元件。不同的是,这些类型的线程执行测试结束后执行定期的线程组;类似LoadRunnner的end,测试结束时进行回收工作。
不同的是执行顺序---它会在普通线程组执行之后被触发。
应用场景举例:
A、测试数据库操作功能时,用于执行关闭数据库连接的操作。
B、测试用户购物功能时,用于执行用户的退出等操作。
2、可拓展线程组
(1)Concurrency Thread Group(递增式并发线程组)
这意味着:
5秒除以5步,每步1秒;100个用户除以5步,每步20个用户;每1秒将添加20个用户,直到达到100个用户,达到100个线程后,所有这些线程将继续运行,并一起打到服务器10秒钟;
注意:这个可以模仿递增式并发(只能递增不能递减),并可设置递增次数、递增时长、到达目标递增数量保持时长等等:
参数解释:
· Target Concurrency:目标并发(总线程数)
· Ramp Up Time:加速时间(总加速时长)
· Ramp-Up Steps Count:加速步骤计数(总加速/递增次数)
· Hold Target Rate Time:保持目标速率时间(到达总线程数后持续时长)
· Time Unit:时间单位(分钟或者秒)
· Thread Iterations Limit:线程迭代次数限制(循环次数)
· Log Threads Status into File:将线程状态记录到文件中(将线程启动和线程停止事件保存为日志文件);
(2)Stepping Thread Group(逐步线程组)
这个可以模仿递增式并发(不但递增还可以递减),并可设置递增次数、递增启动延迟、递增时长、到达目标递增数量保持时长等等:
参数解释:
1、This group will start () threads:线程组能达到的总线程数;
2、First wait for () seconds:首次加载线程前需要等待的时间;
3、Then start () threads:首次加载线程数;
4、Next add () threads every () seconds:每隔多少秒加载多少个线程
5、Using ramp-up () seconds:在几秒内启动线程组
6、Then hold load for () seconds:持续压测时间
7、Finally stop () threads every () seconds:每隔多少秒退出多少个线程
(3)bzm - Arrivals Thread Group(bzm-到达线程组)
所以以上设置就等于:3min除以5步,等于每步加速后持续0.6分钟,100个用户除以5步,等于每步加速20个用户,达到100个用户后持续跑6mn。
参数解释:
1、Target Rate:目标线程数(总线程数)
2、 Ramp Up Time:所需多少加载时间(总加速时长)
3、 Ramp Up Steps Count:所需多少个加载梯次(总递增/加速次数)
4、Hold Target Rate Time:持续运行时间(到达总线程数后持续时长)
5、Time Unit:可以选择用分钟还是秒来做单位
6、Thread lterations Limit:线程迭代次数限制。如果我们只需要运行每个用户一次以模拟用户的实际行为,则可能会很有用。在我们的例子中,该字段为空,因此每个用户将运行不确定的迭代,直到调度结束。
7、Log Thread Status into File:将线程状态记录到文件中
8、Concurrency Limit:最大并发数限制。以避免出现内存不足的问题。在我们的例子中是1000,这是一个很大的数字。
(4)Ultimate Thread Group(最终线程组)
参数解释:
1、Start Threads Count:当前行线程组总数;
2、Initial Delay/sec:延时启动当前行的线程,单位:秒
3、Startup Time/sec:启动当前行所有线程达峰值所需时间,单位:秒
4、Hold Load For/sec:当前行线程达到峰值后的稳定加载时间,单位:秒
5、Shutdown Time:停止当前行所有线程所需时间,单位:秒
Ultimate Thread Group可以用于以下几个场景的测试:
1、创建线性负载
测试场景:60s内启动100个线程,持续运行60s,花10s的时间结束
2、创建阶梯负载
测试场景:测试100个用户,我们将逐步地将它们提升。我们将从25个用户开始在一定时间内保持一个负载,查看服务器如何处理它。之后我们会再加25个到50个再加25个到75个,最后加25个到100个用户。这种方法效果好得多,也更可靠
3、创建尖峰负载
测试场景:平时稳定用户数为500个,维持24小时,在8-9点时用户数飙升至1000个
4、创建波浪形负载
测试场景:比如12306抢票的时候,每次开放抢票时,有大量用户涌入,等到下次开放时,又有大量用户涌入,这个时候,就像波浪一样,不断敲击服务器,考验服务器的性能