线程组元件是任何一个测试计划的开始点。在一个测试计划中的所有元件都必须在某个线程下。所有的任务都是基于线程组
一、setup thread group
一种特殊类型的ThreadGroup,用于在执行常规线程组之前执行一些必要的操作。在“setup thread group ”下的线程行为与普通线程组完全相同。不同的是执行顺序:它会在普通线程组执行之前被触发。
应用场景举例:
A、测试数据库操作功能时,用于执行打开数据库连接的操作。
B、测试用户购物功能时,用于执行用户的注册、登录等操作。
二、teardown thread group
一种特殊类型的ThreadGroup,用于在执行常规线程组完成后执行一些必要的操作。在“teardown thread group ”下的线程行为与普通线程组完全相同。不同的是执行顺序:它会在普通线程组执行之后被触发。
应用场景举例:
A、测试数据库操作功能时,用于执行关闭数据库连接的操作。
B、测试用户购物功能时,用于执行用户的退出等操作。
注意:默认情况下,如果测试按预期完成,则TearDown线程组将不会运行。如果你想要运行它,则需要从Test Plan界面中选中复选框“Run tearDown Thread Groups after shutdown of main threads”。
三、thread group(线程组)
这个就是我们通常使用的线程。一个线程组可以看做一个虚拟用户组,线程组中的每个线程都可以理解为一个虚拟用户。多个用户同时去执行相同的一批次任务。每个线程之间都是隔离的,互不影响的。一个线程的执行过程中,操作的变量,不会影响其他线程的变量值。
1、在取样器错误后要执行的动作
- 继续:忽略错误,继续执行操作(其他取样器不受影响,继续执行)
例如线程组中包含查询设备和查询服务商2个请求,若查询设备请求失败,查询服务商请求会继续执行。
- Start Next Thread Loop:忽略错误,停止当前线程组并直接启动下一个线程组;如设置循环次数非1,那么遇到一个线程失败,线程组当前循环终止,执行下一个循环。
例一:线程组中包含查询设备和查询服务商2个请求且循环次数非1,若查询设备请求失败,查询服务商请求将不再执行,等下一次重新迭代,从查询设备开始执行。
例二:测试计划中包含线程组1和线程组2,线程组1的循环次数是1,那么线程组1执行出错时,会直接启动线程组2
- 停止线程:停止当前线程,其他线程不受影响
- 停止测试:在所有当前正在执行的线程执行完毕后停止整个测试计划
- Stop Test Now:立即停止整个测试计划
如测试计划设置了【独立运行每个线程组(例如在一个组运行结束后启动另一个)】
则线程组1中的某个请求失败了,线程组2中的请求不会被执行
2、线程属性
- 线程数:当前线程组的线程数量,可以简单的理解为用户数量。
- Ramp-up Period (in seconds):达到上面指定线程数所花费的时间,单位为秒。举个例子:假设线程数为100个,花费时间20s,那么每秒启动的线程数 = 线程数/时间,即100/20 = 5,也就是每隔1秒启动5个线程。
- 循环次数:设置的线程数循环的次数。勾选“永远”选项,则线程组一直循环(注意:如果勾选了永远且调度器配置中设置了持续时间,则会在持续时间到达之后结束循环)。
- Delay Thread creation until needed:当线程需要执行的时候,才会被创建。如果不勾选此选项,所有线程在开始时就全部被创建。
此选项和Ramp-up Period设置配合使用,如果勾选此项,则所有线程会在需要的时候启动,即会在Ramp-up Period(in seconds)到时间后启动所有线程,此项作用在于,如果说线程运行时间小于我们设置的Ramp-up Period(in seconds),则会造成一种情况就是在Ramp-up Period(in seconds)结束之前部分线程已经跑完了,这样就会导致活动线程数小于我们设置的线程数,也就意味着我们设置的N个并发的场景并未完全起效。但是如果勾选了此项,则线程会根据Ramp-up Period(in seconds)设置来创建,但是不会启动,直到最后一个线程创建好后一起启动(这样就会很好的模拟到我们的N个并发数了)
如果单个线程的运行时间长于我们设置的Ramp-up Period(in seconds)时间,则此项也不用勾选。
举例说明:如过设置线程数为10,Ramp-up Period(in seconds)时间为100,则如果不勾选此项则此次测试会每隔10s创建并启动一个线程,那么100s后会有1-10个线程在运行;但是如果勾选此项,那么线程组会每隔10s创建一个线程但并不启动sample,而是会等待100s后所有10个线程都创建好之后同时启动sample。
- 调度器:勾选此选项,才可修改下面的调度器配置。
持续时间(秒):整个测试计划持续的时间。(优先于后面的结束时间选项)。注意这个时间设置不要设置的比 Ramp-up Period(in seconds)小,如果勾选了循环次数中的永远,那么测试一样会在此持续时间到达后结束。
启动延迟(秒):测试计划启动后,会被延迟启动,时间为选项填入的时间。(优先于后面的启动时间选项)
启动时间:整个测试计划将于此处填写的时间点启动
结束时间:整个测试计划将于此处填写的时间点结束
如果不想立即执行执行,可以通过调度器控制测试执行的开始时间和结束时间
补充线程知识:
- 新建状态:使用 new 关键字和 Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态。它保持这个状态直到程序 start() 这个线程。
- 就绪状态:当线程对象调用了start()方法之后,该线程就进入就绪状态。就绪状态的线程处于就绪队列中,要等待JVM里线程调度器的调度。
- 运行状态:如果就绪状态的线程获取 CPU 资源,就可以执行 run(),此时线程便处于运行状态。处于运行状态的线程最为复杂,它可以变为阻塞状态、就绪状态和死亡状态。
- 阻塞状态:如果一个线程执行了sleep(睡眠)、suspend(挂起)等方法,失去所占用资源之后,该线程就从运行状态进入阻塞状态。在睡眠时间已到或获得设备资源后可以重新进入就绪状态。可以分为三种:
-
- 等待阻塞:运行状态中的线程执行 wait() 方法,使线程进入到等待阻塞状态。
- 同步阻塞:线程在获取 synchronized 同步锁失败(因为同步锁被其他线程占用)。
- 其他阻塞:通过调用线程的 sleep() 或 join() 发出了 I/O 请求时,线程就会进入到阻塞状态。当sleep() 状态超时,join() 等待线程终止或超时,或者 I/O 处理完毕,线程重新转入就绪状态。
- 死亡状态:一个运行状态的线程完成任务或者其他终止条件发生时,该线程就切换到终止状态。