18.2 Logic Controllers
逻辑控制器决定采样器执行的顺序。
Simple Controller(简单控制器)
简单逻辑控制器可以组织采样器和其他逻辑控制器。与其他逻辑控制器不同,此控制器除了存储设备之外,不提供任何功能。
- Parameters
Attribute | Description | Required |
---|---|---|
Name | 控制器名称 | NO |
- Simple Controller示例
上图展示的是一个测试计划的部分内容,它发送两个ant http请求和两个log4jhttp请求。我们将ant和log4j请求放在简单逻辑控制器中进行分组。注意,简单逻辑控制器不影响添加到线程组中的其他控制器。因此,在本例中,JMeter将按以下顺序发送请求,ant home page、ant news page、log4j homepage、log4j history page。
完整测试计划查看SimpleTestPlan.jmx。
Loop Controller(循环控制器)
如果向循环控制器添加生成或逻辑控制器,那么实际循环的次数除了受线程组指定的循环值影响外,还受到循环控制器设定的循环值的影响。例如,如果向一个循环计数为2的循环控制器添加一个http请求,并且线程组循环计数配置为3,则JMeter将总共发送2*3=6个http请求。
- Parameters
Attribute | Description | Required |
---|---|---|
Name | 控制器名称 | NO |
Loop Count | 该控制器下所有元素的循环次数,值-1表示forever,即永远执行下去。 | NO |
- Loop Controller示例
上图中的测试计划需要发送两个http请求,其中“主页”http请求只发送一次,“新闻页”http请求需发送五次。
这两个http请求放在同一个线程组中,线程组的循环计数值为1,即“主页”http请求只循环一次。另外,“新闻页”http请求外层设置了一个循环控制器,其循环次数为5,用于控制“新闻页”http请求循环5次。
JMeter将按以下顺序发送请求:主页、新闻页、新闻页、新闻页、新闻页和新闻页。
完整测试计划查看LoopTestPlan.jmx
Once Only Controller(只执行一次控制器)
Once Only Controller表示在控制器所在的线程组只执行其一次。
如果Once Only Controller的父类元素是一个循环控制器,则其只在循环控制器的第一次迭代时执行。因此,如果将Once Only Controller控制器放置在循环5次的循环控制器下,则Once Only Controller将仅在循环控制器的第一次迭代时执行。
注意,这意味着只有一个控制器将仍然如先前预期的那样被放置在一个线程组(每个线程每次测试只运行一次),但是现在用户在只使用一次控制器时有更大的灵活性。
对于需要登录的测试,考虑将登录请求放在这个控制器中,因为每个线程只需要登录一次就可以建立会话。
- Parameters
Attribute | Description | Required |
---|---|---|
Name | 控制器名称 | NO |
- Once Only示例
上图测试计划中的线程组共有两个线程,每个线程执行如下操作,首先向HomePage发送一个http请求,然后向BugPage发送三个http请求。尽管我们将线程组配置为迭代三次,但每个JMeter线程只向HomePage发送一个请求,因为该请求位于Once Only Controller中。
完整测试计划查看OnceOnlyTestPlan.jmx t
Interleave Controller(交替控制器)
如果将生成控制器或逻辑控制器添加到交替控制器中,JMeter将在每次循环迭代时交替执行这两个控制器。
- Parameters
Attribute | Description | Required |
---|---|---|
Name | 控制器名称 | NO |
ignore sub-controller blocks | 该设置表示,交替控制器会像处理单个请求那样处理每一个子控制器,即一次只允许一个子控制器的一个请求通过。 | NO |
Interleave across threads | 该设置表示,交错控制器在每个循环迭代时将交替地执行每个子控制器,例如一个测试计划具有4个线程和3个子控制器,第一次迭代时,线程1将运行控制器1,线程2运行控制器2,线程3运行控制器3,线程4运行控制器1,以此类推。 | NO |
-
Interleave Controller示例1
上图测试计划中线程组共配置了两个线程,循环计数为5,因此该线程组总共需发送10个请求。JMeter发送http请求的顺序如下表。
迭代次数 | 发送请求 |
---|---|
1 | News Page |
1 | Log Page |
2 | FAQ Page |
2 | Log Page |
3 | Gump Page |
3 | Log Page |
4 | News Page(再次从第一个请求开始发送) |
4 | Log Page |
5 | FAQ Page |
5 | Log Page |
完整测试计划查看InterleaveTestPlan.jmx
- Interleave Controller示例2
上图测试计划的线程组为一个线程,循环计数为8(截图没有显示)。测试计划中有一个外部交替控制器,其中又包括两个内部交替控制器。
外部交替控制器交替地执行两个内部交替控制器;然后,每个内部交替控制器交替地执行每个http请求。因此,每个线程将按以下顺序发送请求:Home Page, (交替),Bug Page, (交替),CVS Page, (交替),FAQ Page,(交替)...。
如果外部交替控制器下的两个交替控制器是简单控制器,则顺序为:Home Page、CVS Page, (交替),Bug Page, FAQ Page,(交替)...。
但是,如果在外部交替控制器上选中“ignore sub-controller blocks”,则顺序为,Home Page, (交替),Bug Page, (交替),CVS Page, (交替),FAQ Page,(交替)...,即等同于内部是两个交替控制器的情况。
完整测试计划查看InterleaveTestPlan2.jmx
Random Controller(随机控制器)
随机逻辑控制器的作用与交替控制器类似,只是它不是按顺序执行其子控制器和采样器,而是在每次执行时随机选取一个。
多个控制器之间的交互可以产生复杂的行为。随机控制器尤其如此。
- Parameters
Attribute | Description | Required |
---|---|---|
Name | 控制器名称 | NO |
ignore sub-controller blocks | 该设置表示,交替控制器会像处理单个请求那样处理每一个子控制器,即一次只允许一个子控制器的一个请求通过。 | NO |
Random Order Controller(随机顺序控制器)
随机顺序控制器很像一个简单的控制器,它最多执行每个子元素一次,但是执行顺序却是随机的。
Throughput Controller(吞吐量控制器)
吞吐量控制器是最常用的控制器之一,可以允许用户控制它的执行频率。有两种模式:
- 执行百分比(Percent executions)
使控制器执行一定比例的迭代次数。 - 执行总次数(Total executions)
使控制器在执行了一定次数后停止执行。
与Once Only Controller一样,当父循环控制器重新启动时,此设置将重置。
注意,此控制器的名称不准确,因为它不控制吞吐量。请参阅可用于调整吞吐量的Constant Throughput Timer。
当与其他控制器结合时,吞吐量控制器可以产生非常复杂的行为,特别是以交替或随机控制器作为父控制器使用。
- Parameters
Attribute | Description | Required |
---|---|---|
Name | 控制器名称 | NO |
Execution Style | 执行模式,按百分比还是次数执行 | YES |
Throughput | 一个数字。对于百分比模式,是0-100之间的一个数字(可以是小数),表示控制器将按多少比例执行一定的次数。对于执行次数模式,该数字表示控制器将执行的总次数。 | YES |
Per User | 该设置表示控制器执行次数是否考虑每个用户(每个线程)。如果未设置该项,则计算将是所有用户的全局计算。例如,如果使用Total模式,并且不设置Per User,那么吞吐量给定的数字将是执行的总数。如果设置Per User,那么执行的总数将是用户数乘以吞吐量的给定数。 | NO |