3. 测试计划的要素
本节介绍测试计划的不同部分。最低限度的测试将包括测试计划、线程组和一个或多个采样器。测试计划包括线程组,线程组包括采样器。它们之间的添加顺序是:测试计划-》线程组-》采样器-》
3.0 测试计划
⽤来描述⼀个性能/接⼝测试脚本和场景设计,包含与本次测试所有相关的功能。也就是说,使⽤jmeter进⾏测试的所有内容都是于基于⼀个测试计划的。
测试计划的配置项有哪些呢?
1)测试计划名称和注释:
2)⽤户定义的变量:
在测试计划上可以添加⽤户定义的变量,相当于是全局变量。
3)独⽴运⾏每个线程组:
⽤于控制测试计划中的多个线程组的执⾏顺序。
a:不勾选时,默认各线程组并⾏、随机执⾏。当有多个线程组时,线程组1和线程组2的线程是并⾏执⾏的,执⾏过程线程的执⾏顺序是不可预料的。
b:如果勾选了独⽴运⾏每个线程组,可以保证线程组1的执⾏⼀定在线程组2之前,线程组1执⾏完毕,才会执⾏线程组2,即顺序执⾏各线程组。
c:线程组中的取样器的执⾏顺序:默认是从上到下执⾏。
d:可以通过交替控制器、随机控制器、随机顺序控制器和循环控制器等可以改变取样器的执⾏顺序。
4)Run tearDown Thread Groups after shutdown of main threads:
当线程组停⽌运⾏时仍继续运⾏tearDown线程组,该选项结合线程组的执⾏配置使⽤,⼀般很少⽤到,了解即可。
5) 函数测试模式(Functional Testing):
如果选中了此选项,同时监听组件如“查看结果树”配置了保存到⼀个⽂件中,那么jmeter会将每次的请求结果保存到⽂件中。
6) Add directory or jar to classpath:
添加⽂件或jar包,此功能最常⽤于调⽤外部jar包。
当脚本需要调⽤外部的java⽂件或jar包时,可以把jar包路径添加到这⾥,然后在beanshell中直接import进来,并调⽤jar包中的⽅法。
⽐如直接放在jmeter安装bin⽬录下即可。
3.1 线程组
线程组元素是任何测试计划的起点。所有控制器和采样器都必须在一个线程组下。其他元素,例如侦听器,可以直接放在测试计划下,在这种情况下,它们将应用于所有线程组。顾名思义,线程组元素控制 JMeter 用于执行测试的线程数。线程组的控件允许您:
#设置线程数(有10个线程需要运行)
#设置启动线程的时间(图中设置1s启动10个线程)
每个线程将完整地执行测试计划,并且完全独立于其他测试线程。多个线程用于模拟与服务器应用程序的并发连接。
Ramp-up时间告诉 JMeter 需要多长时间才能“加载”到选择的全部线程数。如果使用 10 个线程,并且加速周期为 100 秒,那么 JMeter 将需要 100 秒才能让所有 10 个线程启动并运行。每个线程将在前一个线程开始后 10 (100/10) 秒后开始。如果有 30 个线程和 120 秒的加载周期,那么每隔(120/30)4s加载一个线程。
Ramp-up需要足够长以避免在测试开始时工作负载过大,并且足够使最后一个线程在第一个线程完成之前开始运行(除非有人希望发生这种情况)。
线程组还允许指定线程生命周期。单击“线程组”面板底部的复选框以启用/禁用额外字段。
可以配置持续时间(秒)和启动延迟(秒)来控制每个线程的持续时间组以及它开始的秒数。当测试开始时,JMeter 会在启动 Thread Group 的 Threads 之前等待Startup Delay(秒)。
注意:如果想使调度器配置生效,需要勾选‘循环次数’‘永远’复选框,并且勾选调度器这个复选框。
图中表示有10个线程需要并发执行,1s之内启动10个线程,持续执行15s后结束线程。
如果没有勾选‘永远’复选框,调度器的配置不生效。
3.2.1 采样器
采样器告诉 JMeter 向服务器发送请求并等待响应。它们按照它们在树中出现的顺序进行处理。
JMeter 采样器包括:
每个采样器都有几个可以设置的属性。您可以通过向测试计划添加一个或多个配置元素来进一步自定义采样器。
2) 采样器的配置属性如下:
请记住在您的测试计划中添加一个侦听器,以查看和/或将您的请求结果存储到磁盘,添加一个监听器查看请求结果。
如果您有兴趣让 JMeter 对您的请求响应执行基本验证,请向采样器添加断言。例如,在对 Web 应用程序进行压力测试时,服务器可能会返回成功的“HTTP 响应”代码,但页面上可能有错误或可能缺少部分。您可以添加断言来检查某些HTML 标记、常见错误字符串等。JMeter 允许您使用正则表达式创建这些断言。
3.2.2 逻辑控制器
Logic Controller 允许您自定义 JMeter 用来决定何时发送请求的逻辑。逻辑控制器可以更改来自其子元素的请求的顺序。它们可以自己修改请求,导致 JMeter 重复请求等。
要了解逻辑控制器对测试计划的影响,请考虑以下测试树:
1)一次控制器:
这个测试的第一件事是登录请求只会在第一次执行。随后的迭代将跳过它。这是由于Once Only
Controller的影响。
①名称:随意设置也可以为空
②注释:随意设置也可以为空
③忽略子控制器块:当不勾选时,如果其节点下存在交替控制器、循环控制器、事务控制器,那么控制器下的控制器会被当做一个节点执行,每次只执行其中一个控器器下的所有取样器。
勾选忽略子控制器块,所有控制器(循环控制器、事务控制器、交替控制器)下的取样器会顺序执行
Interleave across threads:意思是允许跨线程交替执行,勾选后,当线程组线程数大于1时,当前线程首次执行会根据线程数顺序进行交替,后续执行按自己所属线程的上一个次的执行的位置交替
3) HTTP 请求默认值
一般情况下,我们在一个项目中调用的接口中域名、端口等都是相同的。当我们创建多个HTTP 请求时,由于这些数据是必填项,所以,我们就需要不停地填写相同的数据。如果项目进行过程中出现了更改域名、更改端口号等情况,我们又需要把每一个请求中的数据都做更改,这样看上去似乎有些麻烦了。
下面我们就来介绍一种方法将这些相同的参数设置为默认的,每次创建 HTTP 请求时就不用再输入了,这就需要我们配置【HTTP 请求默认值】来实现了。
操作步骤:
3、如果我们在设置了默认值后,有特殊需求,可以在创建 HTTP 请求的页面直接填写参数值,Jmeter 会优先使用 【HTTP 请求】页面中设置的参数值。
4) HTTP Cookie管理器。
应将 Cookie 管理器添加到所有 Web 测试中 - 否则 JMeter 将忽略 cookie。通过在线程组级别添加它,我们确保所有 HTTP 请求将共享相同的 cookie。
可以组合逻辑控制器以实现各种结果。请参阅内置逻辑控制器列表。
3.2.3 测试片段
测试片段元素是一种特殊类型的控制器,存在于测试计划树中,与线程组元素处于同一级别。它与线程组的区别在于它不会被执行,除非它被ModuleController或Include_Controller引用。
3.3 监听器
侦听器提供对 JMeter 在 JMeter 运行时收集的有关测试用例的信息的访问。
2) “查看结果树”侦听器显示采样器请求和响应的详细信息,并且可以显示响应的基本 HTML 和 XML 表示。
请注意,所有 Listener 都保存相同的数据;唯一的区别在于数据在屏幕上的显示方式。
可以在测试中的任何位置添加侦听器,包括直接在测试计划下。他们将仅从处于或低于其级别的元素收集数据。
JMeter 附带了几个侦听器。
3.6 配置元素
配置元素与采样器密切合作。虽然它不发送请求(HTTP(S)Test Script Recorder除外),但它可以添加或修改请求。
只能从放置元素的树分支内部访问配置元素。例如,如果您将 HTTP
Cookie 管理器放置在 Simple
Logic Controller 中,则 Cookie 管理器将只能由您放置在 Simple Logic Controller 中的 HTTP 请求控制器访问(参见图 1)。HTTP 请求“网页 1”和“网页 2”可以访问 Cookie 管理器,但“网页 3”不能访问。
此外,树分支中的配置元素比“父”分支中的相同元素具有更高的优先级。例如,我们定义了两个 HTTP Request Defaults 元素,“Web Defaults 1”和“Web Defaults 2”。由于我们将“Web Defaults 1”放置在 Loop Controller 中,因此只有“Web Page 2”可以访问它。其他 HTTP 请求将使用“Web
用户定义 的变量配置元素是不同的。它在测试开始时被处理,无论它放在哪里。为简单起见,建议仅将元素放置在线程组的开头。
3.7 预处理器元素
预处理器在发出采样器请求之前执行一些操作。如果预处理器附加到采样器元素,则它将在该采样器元素运行之前执行。
预处理器最常用于在样本请求运行之前修改其设置。有关何时执行预处理器的更多详细信息,请参阅范围规则。
3.8 后处理器元素
有关何时执行后处理器的更多详细信息,请参阅范围规则。
3.9 执行顺序
请注意,定时器、断言、预处理器和后处理器只有在它们适用的采样器才会被处理。逻辑控制器和采样器按照它们在树中出现的顺序进行处理。其他测试元素根据发现的范围和测试元素的类型进行处理。[在一个类型中,元素按照它们在树中出现的顺序进行处理]。
例如,在以下测试计划中:
执行顺序为:
3.10 范围规则
JMeter 测试树包含分层和有序的元素。
分层:按照元素在树中出现的位置决定它们被使用的范围。
有序:按照出现的顺序进行执行。
测试树中的一些元素是严格分层的(Listeners、Config Elements、Post-Processors、Pre-Processors、Assertions、Timers),还有一些主要是有序的(controllers、samplers)。创建测试计划时,您将创建一个有序的样本请求列表(通过采样器),代表一组要执行的步骤。这些请求通常在同样有序的控制器中进行组织。给定以下测试树:
一些控制器会影响其子元素的顺序,您可以在组件参考中阅读有关这些特定控制器的信息。
其他元素是分层的。例如,一个断言在测试树中是分层的。如果其父项是请求,则将其应用于该请求。如果它的父级是控制器,那么它会影响作为该控制器后代的所有请求。在以下测试树中:
另一个例子,这次使用定时器:
配置元素header管理器、Cookie 管理器和授权管理器的处理方式与配置默认元素不同。配置默认元素的设置被合并到采样器可以访问的一组值中。但是,来自管理器的设置不会合并。如果一个以上的Manager在一个Sampler的范围内,那么只使用一个Manager,但是目前没有办法指定使用哪个。
3.11 属性和变量
JMeter属性在jmeter.properties中定义(有关更多详细信息,请参阅入门 - 配置 JMeter)。
属性是 jmeter 的全局属性,主要用于定义 JMeter 使用的一些默认值。例如,属性remote_hosts定义了 JMeter 将尝试远程运行的服务器。可以在测试计划中引用属性 - 请参阅函数 - 读取属性- 但不能用于特定于线程的值。
JMeter变量是每个线程的本地变量。每个线程的值可能相同,也可能不同。如果一个变量被一个线程更新,只有变量的线程副本被改变。例如,Regular
Expression Extractor Post-Processor 将根据其线程已读取的样本设置其变量,这些变量可以稍后由同一线程使用。有关如何引用变量和函数的详细信息,请参阅函数和变量
请注意,测试计划 和用户定义变量配置元素定义的值在启动时可用于整个测试计划。如果多个元素定义了同一个变量,则最后一个生效。一旦线程启动,初始变量集就会复制到每个线程。其他元素,例如 用户参数或正则表达式提取器,可用于重新定义相同的变量(或创建新变量)。这些重新定义仅适用于当前线程。
setProperty函数可用于定义 JMeter 属性。这些对于测试计划是全局的,因此可用于在线程之间传递信息。
变量和属性都区分大小写。
3.12 使用变量参数化测试
在决定如何构建测试计划时,请记下哪些项目在运行中是不变的,但哪些项目在运行之间可能会发生变化。为这些取一些变量名称 - 可以使用命名约定,例如在它们前面加上C_或K_或仅使用大写来区分它们。
例如,您可以在测试计划中定义以下内容:
您可以在测试计划中将这些称为${HOST} ${THREADS}等。如果您以后想更改主机,只需更改HOST变量的值。这适用于少量测试,但在测试大量不同组合时变得乏味。一种解决方案是使用属性来定义变量的值,例如: