在进行性能测试时,我们都需要构建相应的测试计划。测试计划由测试元素组成,例如线程组、逻辑控制器、样本生成控制器、监听器、定时器、断言和配置元素。每个测试计划中至少应有一个线程组,我们可以根据要求添加或删除元素。
一.线程组
1.三种线程组
     线程组(Threads)是任何一个测试计划的起始点。线程组或者可以叫用户组,进行性能测试时的用户资源池,线程组中的每个线程都可以理解为一个虚拟用户。多个用户同时去执行相同的任务,每个线程之间都是隔离的。
     在一个测试计划中的所有元件都必须在某个线程下。所有的任务都是基于线程组。
     上图可以看到,添加线程组有三个选项,点击创建后,他们的界面是完全一样的。差别在于执行顺序。setup thread group / teardown thread group分别会在普通线程组执行前/执行后被触发。类似于junit中的setup/teardown。
     需要注意的是,默认情况下,如果测试按预期完成,则teardown线程组将不会运行。如果你想要运行它,则需要从test plan界面中选中复选框“Run tearDown Thread Group after shutdown of main threads”
2.线程组的基本设置
part1:线程组的命名与备注
part2:在取样器错误后要执行的动作
- 继续:忽略错误,继续执行
- 启动下一进程循环:忽略错误,线程当前循环终止,执行下一个循环
- 停止线程:当前线程停止执行,不影响其他线程正常执行
- 停止测试:整个测试会在所有当前正在执行的线程执行完毕后停止
- 立即停止测试:整个测试会立即停止执行,当前正在执行的取样器可能会被中断
part3:设置线程属性
- 线程数:模拟的用户数量
- Ramp-Up时间:达到指定线程数(从0升到线程数)所需要的时间。举例:线程数设置为10,Ramp-Up时间设置为50,那么每秒启动的线程数=50/10=5,每个线程将在前一个线程启动后的5s再启动
- 循环次数:该项设置线程组在结束前每个线程循环的次数,如果次数设置为1,那么JMeter在停止前只执行测试计划一次
- Same user on each iteration:如果勾选,表示每次迭代使用相同的线程
- 延迟创建线程直到需要:如果勾选,那么线程只会在合适的需要用到的时候创建
part4:调度器
- 持续时间:设置线程组运行多长时间,单位是秒
- 启动时间:设置线程启动延时时间,单位是秒
通过这里设置线程运行时间周期,只有当循环次数选择“永久”时,才会生效。如果循环次数不是永久,则设置调度器是无用的
二.控制器
JMeter的控制器可分为两类:取样器、逻辑控制器
1.取样器
取样器是允许JMeter将特定类型的请求发送到服务器的组件。他模拟用户对目标服务器的页面的请求。涉及到http等一系列请求,详情见上图
2.逻辑控制器
逻辑控制器可以控制取样器的执行顺序,所以,逻辑控制器需要和取样器一起使用,否则控制器就没有什么意义了。放在控制器下面的所有采样器都会当做一个整体,也会一起被执行
- If控制器:根据给定表达式的值决定是否执行该节点下的子节点
    选中Interpret Condition as Variable Expression:判断变量值是否等于字符串
    选中Evaluate for all children:在每个子节点执行前都会计算表达式
- 事务控制器:生产一个额外的采样器,用来统计该控制器子节点的所有时间
    选中Generate parent sample:选中后,结果为树状图形式;不选中,结果为并列形式
    选中Include duration of timer and pre-post processors in generated sample:选中这一项就会统计定时器(timer)的时间,否则只统计取样器(sample)的时间
- 循环控制器:指定其子节点运行的次数,可以使用具体的数值,也可以使用变量
    Forever选项:勾选上这一项表示一直循环下去
    如果同时设置了线程组的循环次数和循环控制器的循环次数,那循环控制器的子节点运行的次数为两个数值相乘的结果
- ForEach控制器:ForEach控制器一般和用户自定义变量一起使用,其在用户自定义变量中读取一系列相关的变量。该控制器下的取样器或控制器都会被执行一次或多次,每次读取不同的变量值
- 仅一次控制器:在测试计划执行期间,该控制器下的子结点对每个线程只执行一次,登录场景经常会使用到这个控制器