# 测试计划的要素
### 线程组
1. 线程组元素是任何测试计划的起点。所有控制器和采样器必须在线程组下。其他元素(例如,侦听器)可以直接放置在测试计划下。
2. 线程组还提供了调度程jmeter文档学习jmeter文档学习序。单击“线程组”面板底部的复选框以启用/禁用其他字段,您可以在其中输入测试的持续时间,启动延迟,运行的开始和结束时间。您可以配置持续时间(秒)和启动延迟(秒)来控制每个线程组的持续时间以及启动后的秒数。当测试开始时,JMeter将在启动线程组的线程之前等待启动延迟(秒),然后运行配置的持续时间(秒)。请注意,这两个选项会覆盖“ 开始时间”和“ 结束时间”。
3. “ 开始时间”和“ 结束时间”(尽量不建议使用开始时间+结束时间,因为它不太灵活)。在每个周期的末尾,JMeter会检查是否已达到结束时间,如果已结束,则运行将停止,否则,将允许测试继续进行直到达到迭代限制。
### 控制器
1. JMeter有两种类型的控制器:采样器Samplers和逻辑控制器Logical Controllers。
2. 采样器告诉JMeter将请求发送到服务器。
3. 逻辑控制器使您可以自定义JMeter用于决定何时发送请求的逻辑。
* 采样器
1. 采样器告诉JMeter将请求发送到服务器并等待响应。它们按照它们在树中出现的顺序进行处理。控制器可用于修改采样器的重复次数。
2. JMeter采样器包括:
FTP请求
HTTP请求(也可用于SOAP或REST Web服务)
JDBC请求
Java对象请求
JMS请求
JUnit测试请求
LDAP要求
邮件要求
操作系统进程请求
TCP请求
* 逻辑控制器
1. 逻辑控制器使您可以自定义JMeter用于决定何时发送请求的逻辑。逻辑控制器可以更改来自其子元素的请求的顺序。他们可以自己修改请求,使JMeter重复请求,等等。
登录请求将仅在第一次执行。随后的迭代将跳过它。这是由于“ 仅一次控制器”的作用。
### 测试片段
1. 测试片段元素是一种特殊类型的控制器,它与线程组元素位于同一级别的测试计划树上。它与线程组的区别在于,除非被模块控制器或Include_Controller引用,否则它不会执行。
2. 此元素仅用于测试计划中的代码重用
### 侦听器
1. 侦听器提供对JMeter运行时JMeter收集的有关测试用例的信息的访问。图形结果侦听器绘制在曲线图上的响应时间。“查看结果树”侦听器显示采样器请求和响应的详细信息,并可以显示响应的基本HTML和XML表示形式。其他侦听器提供摘要或聚合信息。
2. 此外,侦听器可以将数据定向到文件以供以后使用。JMeter中的每个侦听器都提供一个字段来指示要将数据存储到的文件。还有一个“配置”按钮,可用于选择要保存的字段以及使用CSV还是XML格式。
请注意,所有侦听器都保存相同的数据。唯一的区别在于数据在屏幕上的显示方式。
### 定时器
1. 如果您选择在一个线程组中添加多个计时器,JMeter将使用计时器的总和,并在执行该定时器所适用的采样器之前暂停该时间。可以将定时器作为采样器或控制器的子级添加,以限制将它们应用到的采样器。
### 断言
1. 断言使您可以断言有关从被测试服务器收到的响应的事实。使用断言,您基本上可以“测试”您的应用程序正在返回期望的结果。
请注意,断言适用于其范围内的所有采样器。要将声明限制为单个采样器,请将断言添加为采样器的子级。
2. 要查看断言结果,请将“断言侦听器”添加到线程组。失败的断言还将显示在树视图和表侦听器中,并将计入错误百分比,例如在“汇总”和“摘要”报告中。
### 配置元件
1. 配置元素与采样器紧密配合。尽管它不发送请求(HTTP(S)测试脚本记录器除外),但是它可以添加或修改请求。
2. 配置元素只能从放置该元素的树枝内部访问。而且,树枝内部的配置元素比“父”分支中的相同元素具有更高的优先级。
3. 在用户定义的变量配置元素是不同的。无论在何处放置,都将在测试开始时对其进行处理。为简单起见,建议将元素仅放置在线程组的开始处。
### 预处理器元素(前置处理器)
1. 预处理器在发出“采样器请求”之前执行一些操作。如果将预处理器附加到Sampler元素,则它将在该Sampler元素运行之前执行。预处理器最常用于在采样器请求运行之前修改其设置,或更新不是从响应文本中提取的变量。
### 后处理器元素(后置处理器)
1. 发出采样器请求后,后处理器将执行某些操作。如果将后处理器附加到Sampler元素,则它将在该Sampler元素运行之后立即执行。后处理器最常用于处理响应数据,经常从中提取值。
### 执行顺序
0.配置元素
1.预处理器
2.计时器
3.取样器
4.后处理器(除非SampleResult为null)
5.断言(除非SampleResult为null)
6.监听器(除非SampleResult为null)
请注意,计时器,断言,预处理器和后处理器只有在有适用的采样器时才被处理。逻辑控制器和采样器按照它们在树中出现的顺序进行处理。其他测试元素将根据其发现范围和测试元素的类型进行处理。[在一种类型中,元素按照它们在树中出现的顺序进行处理]。
### 范围界定规格
1. JMeter测试树包含分层和有序的元素。测试树中的某些元素严格是分层的(侦听器,配置元素,后处理器,预处理器,断言,计时器),而有些则主要是有序的(控制器,采样器)。创建测试计划时,您将创建样本请求的有序列表(通过Samplers),该列表表示要执行的一组步骤。这些请求通常在也已排序的控制器中组织。给定以下测试树:
2. 其他元素是分层的。例如,断言在测试树中是分层的。如果其父项是一个请求,则将其应用于该请求。如果其父级是Controller,则它将影响该Controller的所有后代请求。在以下测试树中:
在此示例中,对请求进行命名以反映其执行顺序。计时器#1将应用于请求2、3和4(请注意顺序与分层元素无关)。断言1仅适用于请求三。计时器2将影响所有请求。
配置元素的标题管理器,Cookie管理器和授权管理器与配置默认元素的处理方式有所不同。“配置默认值”元素中的设置被合并为采样器可以访问的一组值。但是,管理器中的设置不会合并。如果在一个采样器的范围内有多个Manager,则仅使用一个Manager,但是目前无法指定使用哪个 Manager 。
### 属性和变量
1. JMeter 属性在jmeter.properties中定义。
2. 属性对于jmeter是全局的,并且主要用于定义JMeter使用的某些默认值。例如,属性remote_hosts定义JMeter将尝试远程运行的服务器。可以在测试计划中引用属性-请参阅功能-读取属性 -但不能用于特定于线程的值。
3. JMeter 变量是每个线程局部的。每个线程的值可以相同,也可以不同。
如果某个变量由线程更新,则仅更改该变量的线程副本。例如,正则表达式提取器后处理器将根据其线程读取的样本设置其变量,这些变量稍后可在同一线程中使用。
4. 请注意,在启动时,将使 “ 测试计划” 和“ 用户定义的变量”配置元素定义的值可用于整个测试计划。如果同一变量由多个UDV元素定义,则最后一个变量生效。线程启动后,会将初始变量集复制到每个线程。其他元素(例如 用户参数预处理器或正则表达式提取器后处理器)可用于重新定义相同的变量(或创建新变量)。这些重新定义仅适用于当前线程。
5. 所述的setProperty函数可以用来定义JMeter的属性。这些对于测试计划是全局的,因此可以用于在线程之间传递信息。
变量和属性都区分大小写。
### 使用变量对测试进行参数化
1. 变量不必更改-可以定义一次,并且如果单独保留,则不会更改值。因此,您可以将它们用作测试计划中经常出现的表达式的简写形式。或对于在运行期间保持恒定但在运行之间可能有所不同的项目。例如,主机名或线程组中的线程数。
2. 在决定如何构建测试计划时,请记下哪些项目对于运行是恒定的,但在运行之间可能会改变。为此确定一些变量名称-也许使用命名约定,例如以C_或K_前缀,或仅使用大写字母将它们与测试期间需要更改的变量区分开。还应考虑哪些项需要在线程本地进行,例如使用正则表达式后处理程序提取的计数器或值。您可能希望对它们使用不同的命名约定。
3. 例如,您可以在测试计划中定义以下内容:
您可以在测试计划中将它们称为$ {HOST} $ {THREADS}等。如果以后要更改主机,只需更改HOST变量的值即可。这对于少量的测试工作正常,但是在测试许多不同的组合时变得乏味。一种解决方案是使用属性来定义变量的值,例如:
然后,您可以在命令行上更改某些或所有值,如下所示:
# 制定网络测试计划
### 添加用户
1. 您要对每个JMeter测试计划进行的第一步是添加一个 线程组元素。线程组告诉JMeter您要模拟的用户数量,用户应多久发送一次请求以及应发送多少次请求。
the Ramp-Up Period(加速周期):默认值1秒。该属性告诉JMeter启动每个用户之间要延迟多长时间。例如,如果您输入5秒钟的加速期,JMeter将在5秒钟结束时完成所有用户的启动。因此,如果我们有5个用户和5秒钟的加速期,则启动用户之间的延迟将为1秒(5个用户/ 5秒= 1个用户每秒)。如果将值设置为0,那么JMeter将立即启动所有用户。
Loop Count(循环计数):该属性告诉JMeter重复测试多少次。如果输入的循环计数值为1,则JMeter将仅运行一次测试。要让JMeter重复运行您的测试计划,请选择永久复选框。
### 添加默认的HTTP请求属性
1. the Web Server's Server Name/IP。对于您正在构建的测试计划,所有HTTP请求都将发送到同一Web服务器如:
jmeter.apache.org。在字段中输入此域名。这是我们将指定默认值的唯一字段,因此请保留其余字段的默认值。
HTTP Request Defaults元素不会告诉JMeter发送HTTP请求。它仅定义HTTP Request元素使用的默认值
### 添加Cokkie支持
1. 几乎所有的Web测试都应使用cookie支持,除非您的应用程序明确不使用cookie。要添加cookie支持,只需将HTTP Cookie Manager添加 到测试计划中的每个线程组。这将确保每个线程都有自己的cookie,但会在所有HTTP Request对象之间共享。
### 添加HTTP请求
JMeter按照它们在树中出现的顺序发送请求。
### 添加侦听器以查看存储测试结果
1. 您需要添加到测试计划中的最后一个元素是 Listener。此元素负责将HTTP请求的所有结果存储在文件中,并提供数据的可视模型。
# 建立数据库测试计划
### 添加JDBC请求
1. 设置以下字段(这些假设我们将使用名为“ cloud ” 的MySQL数据库):
绑定到池的变量名称(此处为:myDatabase)。这需要唯一地标识配置。
JDBC Sampler使用它来标识要使用的配置。
数据库URL:jdbc:mysql:// ipOfTheServer:3306 / cloud
JDBC驱动程序类:com.mysql.jdbc.Driver
用户名:数据库的用户名
密码:用户名的密码
屏幕上的其他字段可以保留为默认值。
2. 再次选择JDBC Users元素。单击鼠标右键获得“ 添加”菜单,然后选择“ 添加” →“ 采样器” →“ JDBC请求”。然后,选择此新元素以查看其控制面板。
JMeter按照将请求添加到树中的顺序发送请求。
首先编辑以下属性:
将名称更改为“ VM Running ”。
输入池名称:“ myDatabase ”(与配置元素中的相同)
输入“ SQL查询字符串”字段。
在参数值字段输入“ 运行 ”值。
用“ VARCHAR ” 输入参数类型。
### 添加侦听器以查看/存储测试结果
1. 该元素负责将JDBC请求的所有结果存储在文件中并显示结果(Summary Report汇总报告)。
# 生成报告仪表板
# 对我们的应用程序进行负载测试!
### 要问的问题
1. 我们预期的平均用户数是多少(正常负载)?
2. 我们预期的高峰用户数是多少?
3. 考虑到这很可能使我们的一台或多台服务器崩溃,什么时候才是对我们的应用程序进行负载测试的好时机?
4. 我们的应用程序有状态吗?如果是这样,我们的应用程序如何管理它(cookie,会话重写或其他方法)?
5. 要达到的测试目的是什么?
# 引言
### 采样器
1. 采样器执行JMeter的实际工作。每个采样器(“Flow Control Action流量控制操作”除外)都会生成一个或多个采样结果。样本结果具有各种属性(成功/失败,经过的时间,数据大小等),并且可以在各种侦听器中查看。
* FTP请求
通过此控制器,您可以将FTP“检索文件”或“上传文件”请求发送到FTP服务器。如果要将多个请求发送到同一FTP服务器,请考虑使用“ FTP请求默认值”配置元素,这样就不必为每个FTP请求生成控制器输入相同的信息。下载文件时,可以将其存储在磁盘(本地文件)或响应数据中,或同时存储在两者中。
延迟设置为登录所需的时间。
* HTTP请求
该采样器使您可以将HTTP / HTTPS请求发送到Web服务器。它还使您可以控制JMeter是否为图像和其他嵌入式资源解析HTML文件,并发送HTTP请求以检索它们。检索以下类型的嵌入式资源:
images
applets
stylesheets (CSS) and resources referenced from those files
external scripts
frames, iframes
background images (body, table, TD, TR)
background sound
如果要将多个请求发送到同一Web服务器,请考虑使用HTTP请求默认值 配置元素,这样就不必为每个HTTP请求输入相同的信息。
# 函数和变量
* JMeter函数是特殊的值,可以填充测试树中任何Sampler或其他元素的字段。函数调用如下所示:
$ {__ functionName(var1,var2,var3)}
其中“ __ functionName”与函数名称匹配。括号括住发送给函数的参数,例如$ {__ time(YMD)} 实际参数因函数而异。不需要参数的函数可以省略括号,例如$ {__ threadNum}。如果函数参数包含逗号,请确保使用“ \ ”将其转义,否则JMeter会将其视为参数定界符。
如果函数参数包含逗号,请确保使用“ \ ”将其转义,否则JMeter会将其视为参数定界符。例如:
$ {__ time(EEE \,d MMM yyyy)}
如果逗号未转义-例如$ {__ javaScript(Math.max(2,5))} -您将收到以下错误:
错误-jmeter.functions.JavaScript:处理Javascript时出错:[Math.max(2]参数列表(<cmd>#1)后的org.mozilla.javascript.EvaluatorException:missing)
这是因为字符串“ Math.max(2,5) ”被视为__javascript函数的两个参数:Math.max(2和5)其他错误消息也是可能的。
* 变量引用如下:
$ {VARIABLE}
如果引用了未定义的函数或变量,JMeter不会报告/记录错误-引用将保持不变。例如,如果未将UNDEF定义为变量,则$ {UNDEF}的值为$ {UNDEF}。 变量,函数(和属性)均区分大小写。 JMeter在使用变量之前会从变量名称中删除空格,因此,例如 $ {__ Random(1,63,LOTTERY)}将使用变量' LOTTERY '而不是' LOTTERY '。
属性与变量不同。变量是线程本地的;属性是所有线程共有的,需要使用__P或__property函数进行引用。
在Windows路径的变量之前使用\之前,例如C:\ test \ $ {test},请确保转义\, 否则JMeter不会解释该变量,例如: C:\\ test \\ $ {test}。或者,仅使用/代替路径分隔符-例如C:/ test / $ {test} -Windows JVM将根据需要转换分隔符。
函数列表,大致分为几种类型
### 函数可以做什么
1. 函数有两种:用户定义的静态值(或变量)和内置函数。
2. 用户定义的静态值允许用户定义在编译和提交要运行的测试树时用其静态值替换的变量。此替换在测试运行开始时发生一次。例如,这可以用来替换所有HTTP请求的DOMAIN字段-只需更改测试以针对具有相同测试的另一台服务器即可,这很简单。
3. 注意,变量当前不能嵌套;即$ {Var $ {N}}不起作用。所述__V(变量)函数可用于执行此操作:$ {__ V(无功$ {N})}。您还可以使用$ {__ BeanShell(vars.get(“ Var $ {N}”))}。
4. 没有功能也可以进行这种替换,但是这种替换不太方便且不太直观。它要求用户创建默认配置元素,以填充Samplers的空白值。 变量只允许替换任何给定值的一部分,而不仅仅是填充空白值。
5. 使用内置函数,用户可以在运行时根据以前的响应数据(函数所处的线程,时间和许多其他来源)计算新值。在测试过程中,将针对每个请求重新生成这些值。
函数在线程之间共享。测试计划中每次出现的函数调用均由单独的函数实例处理。
### 在哪里可以使用函数和变量
1. 函数和变量可以写入任何测试组件的任何字段中(除了TestPlan,请参见下文)。有些字段不允许随机字符串,因为它们需要数字,因此将不接受函数。但是,大多数字段将允许功能。
2. 测试计划中使用的功能有一些限制。在处理函数时,JMeter线程变量将尚未完全设置,因此将不会设置作为参数传递的变量名称,并且变量引用将不起作用,因此split()和regex()以及变量评估函数将不会运行工作。该threadNum()函数将无法正常工作(并不会使在测试计划层次感)。以下功能应在测试计划中正常运行:
intSum
longSum
machineName
BeanShell
groovy
javaScript
jexl2/jexl3
random
time
property functions
log functions
# 后置处理器
### json extractor
1. JSON PostProcessor使您可以使用JSON-PATH语法从JSON响应中提取数据。该后处理器与正则表达式提取器非常相似。必须将其放置为HTTP Sampler或具有响应的任何其他Sampler的子级。它将允许您以非常简单的方式提取文本内容,请参阅JSON Path语法。
Variable names:保存的变量名,后面使用${Variable names}引用
JSON Path expressions:上一步中调试通过的json path表达式
Match Numbers:匹配数字(0代表随机,1代表第一个,-1代表所有)
Default Values:找不到时默认值,一般设置为NOT FOUND
Compute concatenation var(suffix_ALL):是否统计所有,即将匹配到的所有值保存,名为“变量名_ALL”,使用场景需要获取的值有多个,后面需要对这一组数据进行操作。
* JSONPath表达式
XPath提供的功能(此处未缩写的语法,运算符和函数的位置路径)比此处列出的要多得多。而且,下标运算符在Xpath和JSONPath中的工作方式存在显着差异。
* JSONPath示例
让我们通过更多示例来练习JSONPath表达式。我们从在代表书店的XML示例(原始XML文件)之后构建的简单JSON结构开始。
* JSONPath实现
用法:jsonPath(obj, expr [, args])
参数:
obj (object|array):表示JSON结构的对象。
expr (string):JSONPath表达式字符串。
args (object|undefined):对象控制路径评估和输出。当前仅支持一个成员。
args.resultType ("VALUE"|"PATH"):导致结果要么是匹配值(默认值),要么是规范化的路径表达式。
返回值:(array|false):包含与输入路径表达式匹配的值或规范化路径表达式的数组,可用于延迟求值。false如果没有匹配。
问题:当前,JSONPath表达式中仅允许使用单引号。JSONPath位置内的脚本表达式当前未由递归求值jsonPath。一个简单的正则表达式仅扩展全局$和局部@符号。替代jsonPath,返回false在的情况下,不匹配可以是在将来返回一个空数组。
# 自动重定向与跟随重定向的区别
# csv文件参数化
### 配置 CSV Data Set Config
* Filename: 指保存信息的文件目录,可以相对或者绝对路径。否则会在jmeter日志文件(jmeter.log目录位置D:\Program Files\apache-jmeter-2.13\bin)中提示:系统找不到指定文件,运行脚本后,登录失败。
* File encoding: 保持默认。默认为ANSI
* Variable Names: 给csv文件中各列起个名字(有多列时,用英文逗号隔开列名)便于后面引用
* Delimiter:与 .csv文件的分隔符保持一致。如文件中使用的是逗号分隔,则填写逗号;如使用的是TAB,则填写\t;
* Allow quoted data? :是否允许引用数据,---这个目前还未弄明白,设置成True或者False都能正常引用数据。
* Recycle on EOF?:到了文件尾是否循环,True—继续从文件第一行开始读取,False—不再循环
* Stop thread on EOF? :到了文件尾是否停止线程,True—停止,False—不停止,注:当Recycle on EOF设置为True时,此项设置无效。
* Sharing mode:共享模式,All threads –所有线程,Current thread group—当前线程组,Current thread—当前线程。
All threads:计划中所有线程,假如说有线程1到线程n (n>1),线程1取了一次值后,线程2取值时,取到的是csv文件中的下一行,即与线程1取的不是同一行。
Current thread group:当前线程组,假设有线程组A、线程组B,A组内有线程A1到线程An,线程组B内有线程B1到线程Bn。取之情况是:线程A1取到了第1行,线程A2取第2行,现在B1取第1行,线程B2取第2行。
Current thread:当前线程。假设测试计划内有线程1到线程n (n>1),则线程1取了第1行,线程2也取第1行。
# 正则表达式提取器
1. 允许用户从服务器的响应中通过使用perl的正则表达式提取值。该元素会作用在指定范围取样器,用正则表达式提取所需值,生成模板字符串,并将结果存储到给定的变量名中。
2. APPly to:作用范围(返回内容的断言范围)
Main sample and sub-samples:作用于父节点的取样器及对应子节点的取样器
Main sample only:仅作用于父节点的取样器
Sub-samples only:仅作用于子节点的取样器
JMeter Variable:作用于jmeter变量(输入框内可输入jmeter的变量名称)
3. 要检查的响应字段:需要检查的响应报文的范围
主体:响应报文的主体
Body(unescaped):主体,响应的主体内容且替换了所有的html转义符,注意html转义符处理时不考虑上下文,因此可能有不正确的转换,不太建议使用
Body as a Document:从不同类型的文件中提取文本,注意这个选项比较影响性能
Response Headers:响应信息头
Request Headers:请求信息头
URL:统一资源定位符,即Internet上用来描述信息资源的字符串
Response Code:响应状态码,比如200、404等
Response Message:响应信息
4. 引用名称(Reference Name):Jmeter变量的名称,存储提取的结果;即下个请求需要引用的值、字段、变量名(例子中我提取的是SOCIAL_NO)
5. 引用方法:引用方法:${引用名称}
6. 正则表达式(Regular Expression):使用正则表达式解析响应结果,“()”表示提取字符串中的部分值,请不要使用“||”,除非你本身需要匹配这个字符。
下面是常用的正则表达式操作符:
7. 模板(Template):从匹配的结果中创建一个字符串,这是通过正则表达式匹配出来的一组值,意为使用提取到的第几个值(可能有多个值匹配,因此使用模板);从1开始匹配,以此类推. 参数可以在取值模板组合使用,例如:“11-22”作为模板得到的值是使用“-”连接的第一个待匹配内容与第二个待匹配内容组合而成的字符串。用$$引用起来,如果在正则表达式中有多个提取表达式(多个括号括起来的东东),则可以是$1$,$2$等等,表示解析到的第几个值给str,正则表达式的提取模式,值从1开始,
8. 匹配数字(Match No):正则表达式匹配数据的结果可以看做一个数组,表示如何取值:0代表随机取值,正数n则表示取第n个值(比如1代表取第一个值),负数则表示提取所有符合条件的值。
9. 缺省值:匹配失败时候的默认值;通常用于后续的逻辑判断,一般通常为特定含义的英文大写组合,比如:ERROR
10. 最后,根据上面的说明,完成配置,然后可以先添加一个监视器(查看结果树),检查是否取到了对应的值;提取到的参数,调用时用${SOCIAL_NO_1},${SOCIAL_NO_2}...,如果想要得到匹配出的参数的个数,用${SOCIAL_NO_matchNr},如果想随机选取一个,只需要将匹配数字设为0,使用${SOCIAL_NO}调用即可。
# 逻辑控制器
### 简单控制器
1. 使用简单逻辑控制器,您可以组织采样器和其他逻辑控制器。与其他逻辑控制器不同,该控制器不提供存储设备以外的功能。
在此示例中,我们创建了一个测试计划,该计划发送了两个Ant HTTP请求和两个Log4J HTTP请求。我们通过将Ant和Log4J请求放入简单逻辑控制器中来对它们进行分组。记住,简单逻辑控制器对JMeter如何处理添加到它的控制器没有影响。因此,在此示例中,JMeter按照以下顺序发送请求:Ant主页,Ant新闻页面,Log4J主页,Log4J历史页面。注意,File Reporter配置为将结果存储在当前目录中名为“ simple-test.dat ”的文件中。
### 循环控制器
1.如果将生成控制器或逻辑控制器添加到循环控制器,则JMeter除了为线程组指定的循环值之外,还将循环通过它们一定次数。例如,如果将一个HTTP请求添加到一个循环计数为2的循环控制器,并将线程组循环计数配置为3,JMeter将总共发送2 * 3 = 6个 HTTP请求。
JMeter将循环索引公开为名为__jm __ <元素名称> __ idx的变量。因此,例如,如果您的循环控制器名为LC,则可以通过$ {__ jm__LC__idx}访问循环索引。索引从0开始
* 循环计数(loop count)的值为-1等效于检查“ 永久”切换。
* 特殊情况:线程组元素中嵌入的循环控制器的行为略有不同。除非设置为永久,否则它将在完成给定的迭代次数后停止测试。
### 仅一次控制器
1. “仅一次逻辑控制器”告诉JMeter每个线程仅对其内部的控制器进行一次处理,并在进一步迭代期间通过测试计划传递其下的所有请求。
2. 现在,“仅一次控制器”将始终在任何循环父控制器的第一次迭代期间执行。因此,如果将“仅一次控制器”放置在指定要循环5次的循环控制器下,则“仅一次控制器”将在通过循环控制器的第一次迭代中执行(即运行5次)。
3. 请注意,这意味着“仅一次控制器”如果置于“线程组”下(每个线程每个测试仅运行一次),仍然会像以前预期的那样运行,但是现在用户在使用“仅一次控制器”时有了更大的灵活性。
4. 对于需要登录的测试,请考虑将登录请求放置在此控制器中,因为每个线程只需要登录一次即可建立会话。
* 在此示例中,我们创建了一个测试计划,该计划具有两个发送HTTP请求的线程。每个线程向主页发送一个请求,然后向错误页面发送三个请求。尽管我们将线程组配置为迭代3次,但是每个JMeter线程仅将一个请求发送到主页,因为该请求位于“仅一次控制器”中。
* 每个JMeter线程将按以下顺序发送请求:主页,错误页面,错误页面,错误页面。
### Interleave Controller控制器
1. 如果将“生成控制器”或“逻辑控制器”添加到“交错控制器”,JMeter将在每个其他控制器之间交替进行每次循环迭代。
* 忽略子控制器块:如果选中,则交错控制器将把子控制器视为单个请求元素,并且一次只允许每个控制器一个请求。(勾选后,子控制器每次只能发起一个请求)
* 跨线程交织:如果选中,则交错控制器将在每个子控制器之间进行每个循环迭代,但在所有线程之间交替进行,例如在具有4个线程和3个子控制器的配置中,在第一次迭代中,线程1将运行第一个子线程,线程2将运行第二个子线程,线程3第三个孩子,线程4第一个孩子,在下一次迭代中,每个线程将运行以下子控制器。(勾选之后,线程1执行第一个子元素、线程2执行第二个子元素、线程3执行第三个子元素)
在此示例中,我们将线程组配置为具有两个线程,并且循环计数为五个,每个线程总共十个请求。JMeter发送HTTP请求的顺序请参见下表。
* Useful Interleave Example 示例
* 在此示例中,我们将线程组配置为具有单个线程,并且循环计数为8。注意,测试计划有一个外部交错控制器,其中有两个交错控制器。
* 外部交错控制器在两个内部交错控制器之间交替。然后,每个内部交错控制器在每个HTTP请求之间交替。每个JMeter线程将按以下顺序发送请求:主页,交错,错误页面,交错,CVS页面,交错,以及FAQ页面,交错。
* 如果主交错控制器下的两个交错控制器是简单控制器,则顺序为:主页,CVS页面,交错,错误页面,常见问题页面,交错。
* 但是,如果在主交错控制器上选中了“ ignore sub-controller blocks ”,则顺序为:主页,交错,错误页面,交错,CVS页面,交错和常见问题页面,交错。
### 随机控制器
1. 随机逻辑控制器的行为与交错控制器相似,不同之处在于它不是按顺序通过其子控制器和采样器,而是在每次通过时随机选择一个。
多个控制器之间的交互会产生复杂的行为。对于随机控制器尤其如此。在假设任何给定的交互将产生什么结果之前进行实验
* 忽略子控制器块:如果选中,则交错控制器将把子控制器视为单个请求元素,并且一次只允许每个控制器一个请求。
### 随机顺序控制器
1. 当控制器被触发时,将控制器下的所有子节点顺序打乱执行一遍,执行一遍,执行一遍,不是执行一个。
注意:是将子节点的顺序打乱,而非请求的顺序打乱,子节点可以是其他逻辑控制器。
随机控制器为每次只执行节点下的一个子节点,随机顺序控制器是将节点下的所有子节点都正常执行,只是将执行顺序打乱
### 吞吐量控制器(它不控制吞吐量)
1. 吞吐量控制器允许用户控制执行频率。有两种模式:
* 执行百分比:使控制器在测试计划中执行一定百分比的迭代。
* 总处决:使控制器在执行一定数量的执行后停止执行。
与“一次控制器”一样,当父循环控制器重新启动时,将重置此设置。
### Runtime控制器
### if控制器
### while控制器
### switch控制器
### ForEach控制器
### 模块控制器
### 包含(include)控制器
### 事务控制器
### 记录控制器
### 关键部分控制器
网友评论