3. 测试计划的要素

本节介绍测试计划的不同部分。

最低限度的测试将包括测试计划、线程组和一个或多个采样器。

3.0 测试计划

测试计划对象有一个名为“功能测试”的复选框。如果选中,它将导致 JMeter 记录从服务器返回的每个样本的数据。如果您在测试侦听器中选择了一个文件,则此数据将写入文件。如果您正在执行小规模运行以确保正确配置 JMeter 并且您的服务器正在返回预期结果,这将很有用。结果是文件会快速增长,JMeter 的性能会受到影响。如果您正在进行压力测试,则此选项应该关闭(默认情况下它是关闭的)。

如果您不将数据记录到文件中,则此选项没有任何区别。

您还可以使用侦听器上的配置按钮来决定要保存哪些字段。

3.1 线程组

线程组元素是任何测试计划的起点。所有控制器和采样器都必须在一个线程组下。其他元素,例如侦听器,可以直接放在测试计划下,在这种情况下,它们将应用于所有线程组。顾名思义,线程组元素控制 JMeter 用于执行测试的线程数。线程组的控件允许您:

  • 设置线程数
  • 设置加速周期
  • 设置执行测试的次数

每个线程将完整地执行测试计划,并且完全独立于其他测试线程。多个线程用于模拟与服务器应用程序的并发连接。

加速期告诉 JMeter 需要多长时间才能“加速”到选择的全部线程数。如果使用 10 个线程,并且加速周期为 100 秒,那么 JMeter 将需要 100 秒才能让所有 10 个线程启动并运行。每个线程将在前一个线程开始后 10 (100/10) 秒后开始。如果有 30 个线程和 120 秒的加速周期,那么每个连续的线程将延迟 4 秒。

Ramp-up 需要足够长以避免在测试开始时工作负载过大,并且足够短以使最后一个线程在第一个线程完成之前开始运行(除非有人希望发生这种情况)。

从 Ramp-up = 线程数开始,并根据需要向上或向下调整。

默认情况下,线程组配置为在其元素中循环一次。

线程组还允许指定线程生命周期。单击线程组面板底部的复选框以启用/禁用额外字段,您可以在其中输入测试持续时间和启动延迟您可以配置持续时间(秒)启动延迟(秒)来控制每个线程的持续时间组以及它开始的秒数。当测试开始时,JMeter 会在启动 Thread Group 的 Threads 之前等待Startup Delay(秒),并运行配置的Duration(秒)时间。

3.2 控制器

JMeter 有两种类型的控制器:采样器和逻辑控制器。这些驱动测试的处理。

采样器告诉 JMeter 向服务器发送请求。例如,如果您希望 JMeter 发送 HTTP 请求,请添加 HTTP 请求采样器。您还可以通过将一个或多个配置元素添加到采样器来自定义请求。有关详细信息,请参阅 采样器

逻辑控制器允许您自定义 JMeter 用来决定何时发送请求的逻辑。例如,您可以添加一个交错逻辑控制器以在两个 HTTP 请求采样器之间交替。有关详细信息,请参阅逻辑控制器

3.2.1 采样器

采样器告诉 JMeter 向服务器发送请求并等待响应。它们按照它们在树中出现的顺序进行处理。控制器可用于修改采样器的重复次数。

JMeter 采样器包括:

  • FTP 请求
  • HTTP 请求(也可用于 SOAP 或 REST Web 服务)
  • JDBC 请求
  • Java 对象请求
  • JMS 请求
  • JUnit 测试请求
  • LDAP 请求
  • 邮件请求
  • 操作系统进程请求
  • TCP 请求
每个采样器都有几个可以设置的属性。您可以通过向测试计划添加一个或多个配置元素来进一步自定义采样器。

如果您要向同一服务器发送多个相同类型的请求(例如 HTTP 请求),请考虑使用默认配置元素。每个控制器都有一个或多个 Defaults 元素(见下文)。

请记住在您的测试计划中添加一个侦听器,以查看和/或将您的请求结果存储到磁盘。

如果您有兴趣让 JMeter 对您的请求响应执行基本验证,请向采样器添加断言。例如,在对 Web 应用程序进行压力测试时,服务器可能会返回成功的“HTTP 响应”代码,但页面上可能有错误或可能缺少部分。您可以添加断言来检查某些 HTML 标记、常见错误字符串等。JMeter 允许您使用正则表达式创建这些断言。

JMeter 的内置采样器

3.2.2 逻辑控制器

Logic Controller 允许您自定义 JMeter 用来决定何时发送请求的逻辑。逻辑控制器可以更改来自其子元素的请求的顺序。他们可以自己修改请求,导致 JMeter 重复请求等。

要了解逻辑控制器对测试计划的影响,请考虑以下测试树:

  • 测试计划
    • 线程组
      • 一次性控制器
      • 加载搜索页面(HTTP 采样器)
      • 交错控制器
        • 搜索“A”(HTTP 采样器)
        • 搜索“B”(HTTP 采样器)
        • HTTP 默认请求(配置元素)
      • HTTP 默认请求(配置元素)
      • Cookie 管理器(配置元素)

这个测试的第一件事是登录请求只会在第一次执行。随后的迭代将跳过它。这是由于Once Only Controller的影响。

登录后,下一个 Sampler 加载搜索页面(想象一个用户登录的 Web 应用程序,然后转到搜索页面进行搜索)。这只是一个简单的请求,没有通过任何逻辑控制器过滤。

加载搜索页面后,我们要进行搜索。实际上,我们想做两个不同的搜索。但是,我们希望在每次搜索之间重新加载搜索页面本身。我们可以通过 4 个简单的 HTTP 请求元素(加载搜索、搜索“A”、加载搜索、搜索“B”)来做到这一点。相反,我们使用交错控制器,它每次通过测试传递一个子请求。它保持其子元素的顺序(即它不会随机传递一个,而是“记住”它的位置)。交错 2 个子请求可能是多余的,但很容易有 8 个或 20 个子请求。

注意HTTP 请求默认值属于交错控制器。假设“搜索 A”和“搜索 B”共享相同的 PATH 信息(HTTP 请求规范包括域、端口、方法、协议、路径和参数,以及其他可选项目)。这是有道理的——两者都是搜索请求,访问相同的后端搜索引擎(比如说一个 servlet 或 cgi 脚本)。我们可以将这些信息抽象到单个配置元素中,而不是在它们的 PATH 字段中使用相同的信息配置两个 HTTP 采样器。当交错控制器“传递”来自“搜索 A”或“搜索 B”的请求时,它将使用来自 HTTP 默认请求配置元素的值填充空白。因此,对于这些请求,我们将 PATH 字段留空,并将该信息放入配置元素中。在这种情况下,这充其量只是一个小好处,但它展示了该功能。

树中的下一个元素是另一个 HTTP 默认请求,这次添加到线程组本身。线程组有一个内置的逻辑控制器,因此,它完全按照上面描述的方式使用这个配置元素。它填充任何通过的请求的空白。在 Web 测试中,将所有 HTTP 采样器元素中的 DOMAIN 字段留空非常有用,而是将该信息放入 HTTP 默认请求元素中,添加到线程组中。通过这样做,您只需更改测试计划中的一个字段即可在不同的服务器上测试您的应用程序。否则,您必须编辑每个采样器。

最后一个元素是HTTP Cookie 管理器。应将 Cookie 管理器添加到所有 Web 测试中 - 否则 JMeter 将忽略 cookie。通过在线程组级别添加它,我们确保所有 HTTP 请求将共享相同的 cookie。

可以组合逻辑控制器以实现各种结果。请参阅内置逻辑控制器列表。

3.2.3 测试片段

测试片段元素是一种特殊类型的控制器,存在于测试计划树中,与线程组元素处于同一级别。它与线程组的区别在于它不会被执行,除非它被Module ControllerInclude_Controller 引用

此元素纯粹用于测试计划中的代码重用

3.3 监听器

侦听器提供对 JMeter 在 JMeter 运行时收集的有关测试用例的信息的访问。Graph Results侦听器在 图表上绘制响应时间。“查看结果树”侦听器显示采样器请求和响应的详细信息,并且可以显示响应的基本 HTML 和 XML 表示。其他侦听器提供摘要或聚合信息。

此外,侦听器可以将数据定向到文件以供以后使用。JMeter 中的每个侦听器都提供了一个字段来指示要存储数据的文件。还有一个配置按钮,可用于选择要保存的字段,以及是否使用 CSV 或 XML 格式。

请注意,所有 Listener 都保存相同的数据;唯一的区别在于数据在屏幕上的显示方式。

可以在测试中的任何位置添加侦听器,包括直接在测试计划下。他们将仅从处于或低于其级别的元素收集数据。

JMeter 附带了几个侦听器。

3.4 定时器

默认情况下,JMeter 线程按顺序执行采样器而不会暂停。我们建议您通过将可用计时器之一添加到您的线程组来指定延迟。如果您不添加延迟,JMeter 可能会在很短的时间内发出过多的请求,从而使您的服务器不堪重负。

计时器将导致 JMeter在其范围内的每个采样器之前延迟一定的时间。

如果您选择将多个计时器添加到线程组,JMeter 将获取计时器的总和并在执行计时器适用的采样器之前暂停该时间量。定时器可以作为采样器或控制器的子级添加,以限制它们应用到的采样器。

要在测试计划中的单个位置提供暂停,可以使用Flow Control Action Sampler。

3.5 断言

断言允许您断言有关从正在测试的服务器收到的响应的事实。使用断言,您基本上可以“测试”您的应用程序正在返回您期望的结果。

例如,您可以断言对查询的响应将包含某些特定文本。您指定的文本可以是 Perl 样式的正则表达式,并且您可以指示响应将包含文本,或者它应该匹配整个响应。

您可以向任何采样器添加断言。例如,您可以将断言添加到检查文本“ </HTML> ”的 HTTP 请求。然后 JMeter 将检查 HTTP 响应中是否存在文本。如果 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 Defaults 2”,因为我们将它放在线程组(所有其他分支的“父级”)中。

图 1 - 显示配置元素可访问性的测试计划
图 1 - 显示配置元素可访问性的测试计划
用户定义 的变量配置元素是不同的。它在测试开始时被处理,无论它放在哪里。为简单起见,建议仅将元素放置在线程组的开头。

3.7 预处理器元素

预处理器在发出采样器请求之前执行一些操作。如果预处理器附加到采样器元素,则它将在该采样器元素运行之前执行。预处理器最常用于在样本请求运行之前修改其设置,或更新未从响应文本中提取的变量。有关何时执行预处理器的更多详细信息,请参阅范围规则。

3.8 后处理器元素

在发出采样器请求后,后处理器会执行一些操作。如果 Post-Processor 附加到 Sampler 元素,则它将在该 sampler 元素运行后立即执行。后处理器最常用于处理响应数据,通常用于从中提取值。有关何时执行后处理器的更多详细信息,请参阅范围规则

3.9 执行顺序

  1. 配置元素
  2. 预处理器
  3. 计时器
  4. 采样器
  5. 后处理器(除非 SampleResult 为null
  6. 断言(除非 SampleResult 为null
  7. 侦听器(除非 SampleResult 为null
请注意,定时器、断言、预处理器和后处理器只有在它们适用的采样器时才会被处理。逻辑控制器和采样器按照它们在树中出现的顺序进行处理。其他测试元素根据发现的范围和测试元素的类型进行处理。[在一个类型中,元素按照它们在树中出现的顺序进行处理]。

例如,在以下测试计划中:

  • 控制器
    • 后处理器 1
    • 采样器 1
    • 采样器 2
    • 定时器 1
    • 断言 1
    • 预处理器 1
    • 定时器 2
    • 后处理器 2
执行顺序为:
Pre-Processor 1
Timer 1
Timer 2
Sampler 1
Post-Processor 1
Post-Processor 2
Assertion 1

Pre-Processor 1
Timer 1
Timer 2
Sampler 2
Post-Processor 1
Post-Processor 2
Assertion 1

3.10 范围规则

JMeter 测试树包含分层和有序的元素。测试树中的一些元素是严格分层的(Listeners、Config Elements、Post-Processors、Pre-Processors、Assertions、Timers),还有一些主要是有序的(controllers、samplers)。创建测试计划时,您将创建一个有序的样本请求列表(通过采样器),代表一组要执行的步骤。这些请求通常在同样有序的控制器中进行组织。给定以下测试树:

示例测试树
示例测试树

请求的顺序为一、二、三、四。

一些控制器会影响其子元素的顺序,您可以在组件参考中阅读有关这些特定控制器的信息。

其他元素是分层的。例如,一个断言在测试树中是分层的。如果其父项是请求,则将其应用于该请求。如果它的父级是控制器,那么它会影响作为该控制器后代的所有请求。在以下测试树中:

层次结构示例
层次结构示例

断言#1 仅应用于请求一,而断言#2 应用于请求二和三。

另一个例子,这次使用定时器:

复杂的例子
复杂的例子

在此示例中,请求被命名以反映它们将执行的顺序。Timer #1 将适用于请求二、三和四(请注意顺序与分层元素无关)。断言 #1 将仅适用于请求三。Timer #2 将影响所有请求。

希望这些示例能够清楚地说明如何应用配置(分层)元素。如果您想象每个请求都被传递到树的分支上,传递到其父级,然后传递到其父级的父级,等等,并且每次都收集该父级的所有配置元素,那么您将看到它是如何工作的。

配置元素标头管理器、Cookie 管理器和授权管理器的处理方式与配置默认元素不同。配置默认元素的设置被合并到采样器可以访问的一组值中。但是,来自管理器的设置不会合并。如果一个以上的Manager在一个Sampler的范围内,那么只使用一个Manager,但是目前没有办法指定使用哪个

3.11 属性和变量

JMeter属性jmeter.properties中定义(有关更多详细信息,请参阅入门 - 配置 JMeter)。
属性是 jmeter 的全局属性,主要用于定义 JMeter 使用的一些默认值。例如,属性remote_hosts定义了 JMeter 将尝试远程运行的服务器。可以在测试计划中引用属性 - 请参阅函数 - 读取属性- 但不能用于特定于线程的值。

JMeter变量是每个线程的本地变量。每个线程的值可能相同,也可能不同。
如果一个变量被一个线程更新,只有变量的线程副本被改变。例如,Regular Expression Extractor Post-Processor 将根据其线程已读取的样本设置其变量,这些变量可以稍后由同一线程使用。有关如何引用变量和函数的详细信息,请参阅函数和变量

请注意,测试计划用户定义变量配置元素定义的值在启动时可用于整个测试计划。如果多个 UDV 元素定义了同一个变量,则最后一个生效。一旦线程启动,初始变量集就会复制到每个线程。其他元素,例如 用户参数预处理器或正则表达式提取器后处理器,可用于重新定义相同的变量(或创建新变量)。这些重新定义仅适用于当前线程。

setProperty函数可用于定义 JMeter 属性。这些对于测试计划是全局的,因此可用于在线程之间传递信息 - 如果需要的话。

变量和属性都区分大小写。

3.12 使用变量参数化测试

变量不必改变 - 它们可以定义一次,如果不理会,不会改变值。因此,您可以将它们用作测试计划中频繁出现的表达式的简写。或者对于在运行期间保持不变但在运行之间可能会有所不同的项目。例如,主机的名称,或线程组中的线程数。

在决定如何构建测试计划时,请记下哪些项目在运行中是不变的,但哪些项目在运行之间可能会发生变化。为这些决定一些变量名称 - 可能使用命名约定,例如在它们前面加上C_K_或仅使用大写来将它们与需要在测试期间更改的变量区分开来。还要考虑哪些项目需要是线程本地的 - 例如计数器或使用正则表达式后处理器提取的值。您可能希望对它们使用不同的命名约定。

例如,您可以在测试计划中定义以下内容:

HOST             www.example.com
THREADS          10
LOOPS            20
您可以在测试计划中将这些称为${HOST} ${THREADS}等。如果您以后想更改主机,只需更改HOST变量的值。这适用于少量测试,但在测试大量不同组合时变得乏味。一种解决方案是使用属性来定义变量的值,例如:
HOST             ${__P(host,www.example.com)}
THREADS          ${__P(threads,10)}
LOOPS            ${__P(loops,20)}
然后,您可以更改命令行上的部分或全部值,如下所示:
jmeter … -Jhost=www3.example.org -Jloops=13

Go to top