JMeter官方文档阅读及实践笔记(上)

本文详细介绍了JMeter测试计划的组成部分,包括线程组、采样器、逻辑控制器、定时器、监听器、断言、配置元件等,以及它们在构建测试计划中的作用和执行顺序。此外,还探讨了HTTP和JDBC采样器,以及如何使用逻辑控制器模拟复杂的测试逻辑。最后,提到了几种常用的定时器类型,用于控制请求之间的延迟。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JMeter笔记

一、测试计划元件概览

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

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

image-20230313145617484

1、Thread Group,线程组

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

  • 设置线程数
  • 设置Ramp-up 时间
  • 设置执行测试的循环次数

image-20230313150900300

2、Controller,控制器

控制器有两种,即Samplers(采样器) 与Logical Controllers(逻辑控制器)。

2.1 Samplers(采样器)

采样器用于向服务器送不同协议的请求(HTTP/JDBC等),采样器告诉JMeter向服务器发送请求并等待响应。它们按照它们在树中出现的顺序进行处理。逻辑控制器可用于修改采样器的重复次数及执行逻辑。

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

每个采样器都有几个可以设置的属性。可以通过向测试计划中添加一个或多个配置器来进一步自定义采样器。在测试计划中添加一个监听器,以查看和/或将请求的结果存储到磁盘。

最后可向采样器进行各种类型的断言断言支持正则匹配

2.2 Logical Controllers(逻辑控制器)

逻辑控制器允许自定义JMeter用来决定何时发送请求的逻辑,类似与编程语言中的if_else、while、for等控制语句。为说明逻辑控制器在测试计划中的作用,用以下结构的测试计划树来举例说明:

image-20230312194054207

2.3 Test Fragments(测试片段)

其概念类似于编程语言中的方法/函数、库,纯粹是测试计划中的“代码重用”。

Test Fragment元素是一种特殊类型的控制器,与Thread Group元素位于同一级别的测试计划树上。它与线程组的区别在于,除非模块控制器或Include_Controller引用它,否则不会执行它。

3、 Listeners,监听器

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

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

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

4、Timers,定时器

默认情况下,JMeter线程在不暂停的情况下按顺序执行采样器。官方文档建议测试人员通过向线程组中添加一个可用定时器来指定延迟(思考时间,模拟真实用户在实际操作中的停顿)。如果不添加延迟,JMeter可能会在很短的时间内发出太多请求,从而使服务器不堪重负。

定时器会使其子节点采样器(Sampler)在正式发出请求前进行一定的延时。

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

为了在测试计划中的单个位置提供暂停,可以使用流量控制动作采样器,即测试活动采样器:

image-20230312203407597

5、Assertions,断言

断言允许测试人员断言有关从被测试服务器接收的实际响应。使用断言,以测试应用程序的实际响应与预期是否相符。

例如,可以对查询的响应将包含某些特定的文本进行断言。断言支持正则表达式,并且可以指示响应包含文本,或者它应该与整个响应匹配。测试人员可以向任何采样器添加断言。例如,向HTTP请求添加一个断言,以检查文本“</HTML>”。然后JMeter将检查HTTP响应中是否存在文本。如果JMeter找不到文本,那么它会将其标记为失败请求。

注意,断言适用于其范围内的所有采样器。要将断言限制为单个采样器,请将断言添加为采样器的子级

要查看断言结果,请将断言侦听器添加到线程组。失败的断言也将显示在树视图和表侦听器中,并将计入错误%age,例如在聚合和摘要报告中,如:

image-20230312210030123

image-20230312210141361

6、Configuration Elements,配置元件

配置元件与采样器密切配合。虽然它不发送请求(HTTP(S)测试脚本记录器除外),但它可以添加或修改请求,配置元件管理采样器的属性。

配置元件只能从放置该元素树分支内部访问,同时,子级配置元件中的值会覆盖父级配置元件中的值,从这点上看,配置元件概念上类似于编程语言中的本地变量,如下图:

image-20230312213222701

用户定义变量配置元件不同。无论将其放置在何处,都会在测试开始时进行处理,这相当与编程语言中的宏定义或全局变量。为了简单起见,建议仅将元素放置在线程组的开头。

image-20230312213848144

7、Pre-Processor Elements,前置处理器

前置处理器在发出采样器请求之前执行一些操作。如果前置处理器连接到采样器元素,那么它将在采样器元素运行之前执行。前置处理器最常用于在样本请求运行之前修改其设置,或更新未从响应文本中提取的变量

8、Post-Processor Elements,后置处理器

后置处理器在发出采样器请求后执行一些操作。如果后置处理器附加到采样器元素,那么它将在采样器元素运行后立即执行。后置处理器最常用于处理响应数据,通常用于从中提取值。它与前置处理器联合起来常用于接口关联

9、元件执行顺序

同类型的元件按其出现的先后顺序执行,不同类型的元件按以下顺序运行:

  1. 配置元件
  2. 前置处理器
  3. 定时器
  4. 采样器
  5. 后置处理器(除非采样结果为空)
  6. 断言(除非采样结果为空)
  7. 监听器(除非采样结果为空)

请注意,计时器、断言、前置处理器和后置处理器仅在有采样器应用时才进行处理。逻辑控制器和采样器按照它们在树中出现的顺序进行处理。根据发现其他测试元件的范围和测试元件的类型来处理其他测试元件。在类型中,元件按照它们在树中出现的顺序进行处理

如以下测试计划树:

  • Controller

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

其执行顺序为:

image-20230313125422946

10、作用域规则

JMeter测试树包含分层和有序的元素。测试树中的一些元素是严格分层的(监听器、配置元件、后置处理器、前置处理器、断言、定时器),有些元素是主要排序的(控制器、采样器)。当测试人员创建测试计划时,将创建一个有序的样本请求列表(通过采样器),该列表表示要执行的一组步骤。这些请求通常被组织在同样被排序的控制器内。给定以下测试树:

image-20230313130224252

其请求执行顺序依次为:A_请求、B_请求、C_请求、D_请求。有些控制器会影响其子元素的顺序,可以在组件引用中了解这些特定的控制器。

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

image-20230313131430997

所以上述测试树中各元件的执行顺序为:

A_请求
A_响应断言

B_请求
B_响应断言

C_请求
B_响应断言

D_请求

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

image-20230313133521987

所以上述含定时器的测试树中各元件的执行顺序为:

B_固定定时器
A_请求

A_固定定时器
B_固定定时器
B_请求

A_固定定时器
B_固定定时器
C_请求
A_响应断言

A_固定定时器
B_固定定时器
D_请求

B_固定定时器
E_请求

在配置元件中,还需注意管理器和默认值的区别,如下图:

image-20230313135001057

11、属性与变量

JMeter属性定义于文件jmeter.properties(此文件在/bin目录下)中,其详细配置点见Configuring JMeter,此文件中定义的所有变量对于JMeter而言是全局变量,例如,属性remote_hosts定义JMeter将尝试远程运行的服务器。此文件中的属性可被测试计划中的变量引用,详见Functions - read a property,但不能用于线程特定值。

JMeter变量是每个线程的本地变量。每个线程的值可能相同,也可能不同。 如果某个变量由线程更新,则仅更改该变量的线程副本。例如,正则表达式提取器后置处理器将根据其线程读取的样本设置其变量,这些变量稍后可以由同一线程使用。有关如何引用变量和函数的详细信息,见Functions and Variables

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

setProperty 函数可用于定义JMeter属性。这些对测试计划是全局的,因此可以按实际需要在线程之间传递变量/信息

属性与变量都是大小写敏感的。

12、使用变量参数化测试

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

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

HOST             www.example.com
THREADS          10
LOOPS            20

可以在测试计划中使用${HOST}、${THREADS}等来引用其值。如果以后要更改主机,只需更改HOST变量的值。这对于少量的测试很好,但在测试大量不同的组合时会变得乏味。一种解决方案是使用属性来定义变量的值,例如:

HOST             ${__P(host,www.example.com)} #__P(property,default)是函数,若property不存在或未定义,则返回默认值default,default默认是一。
THREADS          ${__P(threads,10)}
LOOPS            ${__P(loops,20)}

然后,可以按如下方式在命令行上更改的部分或全部值:

jmeter … -Jhost=www3.example.org -Jloops=13

此后,HOST=www3.example.org,LOOPS=13

除上述方式外,也可通过JMeter内置函数来参数化测试。

二、构建测试计划

在本节中,你将学习如何创建基本测试计划来测试网站。你将创建五个用户,向JMeter网站上的两个页面发送请求。此外,你将告诉用户运行两次测试。因此,请求总数为(5个用户)x(2个请求)x(重复2次)=20个HTTP请求。要构建测试计划,你将使用以下元素:线程组、HTTP请求、HTTP请求默认值和图形结果。

有关更高级的测试计划,请参阅Building an Advanced Web Test Plan

1、添加用户(线程组)

每个JMeter测试计划要做的第一步是添加线程组线程组设置JMeter要模拟的用户数、用户发送请求的频率以及应该发送的请求数。

image-20230313151050293

添加线程组后,按下图设置参数,其余部分保持默认:

image-20230313151830152

2、添加HTTP默认请求属性(HTTP请求默认值)

HTTP请求默认值不会使JMeter发送HTTP请求。它只定义了HTTP采样器使用的默认值。

image-20230313152539168

image-20230313153022912

3、添加Cookie支持(HTTP Cookie 管理器)

几乎所有的web测试都应该使用cookie支持,除非你的应用程序特别不使用cookie。要添加cookie支持,只需在测试计划中的每个线程组中添加一个HTTP cookie管理器。这将确保每个线程都获得自己的cookie,但会在所有HTTP请求对象中共享。

image-20230313153906385

无需对Cookie管理器的属性进行任何设置:

image-20230313154034396

4、添加HTTP请求(HTTP采样器)

image-20230313155235073

JMeter按照请求在树中出现的顺序发送请求,所以依次添加以下两个HTTP请求,仅编辑标记的部分,其余保持默认即可:

image-20230313155007122

image-20230313155214354

5、添加监听器查看结果

需要添加到测试计划中的最后一个元件是侦听器。该元件负责将HTTP请求的所有结果存储在文件中,并提供数据的可视化模型。按下图添加以下两个监听器:

image-20230313160006950

image-20230313160029046

三、常用采样器详述

1、HTTP采样器

(1)概述

此采样器允许测试人员向web服务器发送HTTP/HTTPS请求。它还允许测试人员控制JMeter是否解析HTML文件中的图像和其他嵌入资源,并发送HTTP请求以检索它们。默认的解析器是org.apache.jmeter.protocol.http.parser.LagartoBasedHtmlParser。这可以通过jmeter.properties使用属性htmlparser.className进行更改。

如果要向同一web服务器发送多个请求,请考虑使用HTTP请求默认值这一配置元件,这样就不必为每个HTTP请求输入相同的信息。

或者,有时可能希望使用JMeter的HTTP(s)测试脚本记录器来创建HTTP请求,而不是手动添加HTTP请求。如果有很多HTTP请求或带有许多参数的请求,这可以节省时间。

(2)有关HTTP实现

HTTP采样器的实现有以下三种,可按实际需要设置:

image-20230314105314511

其中,使用Java JVM提供的HTTP实现有以下限制:

  • 无法控制如何重新使用连接。当JMeter释放连接时,同一个线程重新使用该连接的可能不确定;
  • 不支持Kerberos身份验证;
  • 它不支持使用Keystore Config进行基于客户端的证书测试;
  • 它仅支持以下请求方法:GET、POST、HEAD、OPTIONS、PUT、DELETE 和 TRACE;

如果请求需要服务器或代理登录授权(即浏览器将创建弹出对话框),则还必须添加HTTP授权管理器配置元件。对于正常登录(即用户在表单中输入登录信息),您需要确定表单提交按钮的作用,并使用适当的方法(通常是POST)和表单定义中的适当参数创建HTTP请求。如果页面使用HTTP,则可以使用JMeter代理来捕获登录序列。

(3)SSL证书设置

每个线程使用单独的SSL上下文。如果要使用单个SSL上下文(而不是浏览器的标准行为),即所有线程共用一个SSL上下文,请设置JMeter属性:

https.sessioncontext.shared=true

默认情况下,从5.0版开始,SSL上下文在线程组迭代期间保留,并为每个测试迭代重置。如果在测试计划中,同一用户迭代多次,则应将其设置为false。

httpclient.reset_state_on_thread_group_iteration=true

注意,这不适用于 Java HTTP实现:
image-20230314111255997

JMeter默认为SSL协议级别TLS。如果服务器需要不同的级别,例如SSLv3,请更改JMeter属性,例如:

https.default.protocol=SSLv3

JMeter还允许通过更改属性https.socket.protocols来启用其他协议。

(4)有关Cookie的建议

如果请求使用Cookie,那么您还需要一个HTTP Cookie管理器。您可以将这些元素添加到线程组或HTTP请求中。如果有多个HTTP请求需要授权或cookie,请将这些元素添加到线程组。这样,所有HTTP请求控制器将共享相同的授权管理器和Cookie管理器元素。

(5)采样器参数详情
Basic 选项卡各参数

image-20230314130517615

image-20230314130559841

image-20230314130624522

image-20230314130731251

Advance 选项卡各参数

image-20230314131017808

(6)模拟慢连接

HttpClient4Java Sampler支持模拟慢速连接,见jmeter.properties中的以下条目:

# Define characters per second > 0 to emulate slow connections
#httpclient.socket.http.cps=0
#httpclient.socket.https.cps=0

然而,Java Sampler仅支持慢速HTTPS连接。

(7)响应大小计算

Java实现在响应体大小中不包括传输开销,例如块头。 HttpClient4实现却是在响应体大小中包含开销,因此该值可能大于响应内容中的字节数。

(8)重试处理

默认情况下,HttpClient4Java实现的重试都设置为0,这意味着不尝试重试。 对于HttpClient4,可以通过设置相关的JMeter属性来覆盖重试计数,例如:

httpclient4.retrycount=3

对于HttpClient4,默认情况下将在Idempente Http方法上进行重试。如果要重试所有方法,请设置属性:

httpclient4.request_sent_retry_enabled=true

注意,默认情况下,Java实现不会重试,可以通过设置来指定:

http.java.sampler.retries=3
(9)证书异常的处理

可能会遇到错误:java.security.cert.CertificateException: Certificates does not conform to algorithm constraints。如果在具有SSL证书(其本身或其信任链中的一个SSL证书)的网站上运行HTTPS请求,该证书的签名算法使用MD2(如md2WithRSAEncryption)或SSL证书的大小小于1024位,则证书不符合算法约束。

此错误与Java 8中安全性的提高有关。

为了顺利执行HTTPS请求,可以通过编辑Java jdk.certpath.disabledAlgorithms属性来降低Java安装的安全性。根据实际情况,删除MD2值或大小限制。该属性在以下路径中:

JAVA_HOME/jre/lib/security/java.security

2、JDBC采样器

(1)概述

此采样器用于向数据库发送JDBC请求(SQL查询)。

image-20230314173503868

(2)JDBC Connection Configuration

image-20230314164501219

(3)设置Query Type

image-20230314173016432

(4)应用举例

有以下表和Select 语句,如下:

image-20230314175821223

使用JDBC采样器来实现和上面SQL一样的效果:

image-20230314175920599

3、测试活动采样器(Flow Control Action)

测试活动采样器是一种用于条件控制器的采样器。此测试元件不是生成样本,而是暂停或停止选定的目标。

image-20230312203407597

这个采样器与事务控制器结合使用也很有用,因为它允许在不需要生成样本的情况下包含暂停。对于可变延迟,将暂停时间设置为零,并添加一个定时器作为子项。

image-20230317140744921

四、逻辑控制器

逻辑控制器确定采样器的处理顺序或逻辑。

1、简单控制器

简单逻辑控制器用于组织采样器和其他逻辑控制器。与其他逻辑控制器不同,该控制器不提供组织以外的功能。如果把JMeter元件当成编程语言中的“语句”的话,简单控制器则相当于一个花括号或python的缩进,用于将其他“语句”组织起来:

image-20230314190639698

以下图为例,各元件的执行顺序为:A1->A2->B1->B2

image-20230314190808138

2、循环控制器

每次在测试运行期间,用于控制此控制器的子元件将被迭代的运行次数;作用类似于编程语言中的for循环。

JMeter将循环索引公开为名为**__jm__<循环控制器名称>__idx的变量。例如,如果循环控制器名为LC,则可以通过${__jm__LC__idx}**访问循环索引。索引从0开始。

image-20230314194438523

以下图为例,各元件的执行顺序为A->B->B->B->B->B:

image-20230314194753237

3、仅一次控制器

此控制器下的子控制器在每个线程中将只运行一次,这对于登录请求十分有用,因为在实际操作中线程(用户)仅需登录一次就可获取之后的请求所需的token、sessionID或cookie等持久化标记变量。

image-20230314215711222

以下图为例的测试计划中,线程组有发送两个HTTP请求的线程,每个线程登录一次,之后再进行搜索B三次,尽管将线程组的迭代次数设置为3,但每个JMeter线程只登录一次,因为该请求位于仅一次控制器中。

image-20230314220828500

每个JMeter线程将按以下顺序发送请求:登录、搜索B、搜索B、搜索B。

4、交替控制器

如果将元件或其他逻辑控制器添加为交替控制器的子控制器,则JMeter将在每个循环迭代的其他控制器之间交替。

image-20230314223811570

(1)选项 Interleave across threads

勾选Interleave across threads的作用,以下图的计划树举例说明,此树的线程组有4各线程4次迭代:

image-20230314230827156

(2)示例
示例一

image-20230315113732913

迭代序数每个JMeter线程在每次迭代中发送的请求
1A_HTTP请求
1D_HTTP请求
2B_HTTP请求
2D_HTTP请求
3C_HTTP请求
3D_HTTP请求
4因为在交替控制器中没有更多的请求, JMeter重新启动并发送第一个HTTP请求,即A_HTTP请求。
4D_HTTP请求
5B_HTTP请求
5D_HTTP请求
示例二

在本例中,我们将线程组配置为具有单个线程,循环计数为8。注意,测试计划有一个外部交替控制器,内部有两个交替控制器。

image-20230315115057129

外部交替控制器在两个内部交替控制器之间交替。然后,每个内部Interleave Controller在每个HTTP请求之间交替。每个JMeter线程将按以下顺序发送请求:A1、C、B1、C、A2、C、B2、C。

如果主交替控制器下的两个交替控制器是简单的控制器,则顺序为:A1、A2、C、B1、B2、C。然而,如果在此同时,主交替控制器(O_交替控制器)上选中了忽略子控制器块,则顺序为:A1、C、B1、C、A2、C、B2、C。

5、随机控制器

随机逻辑控制器的作用类似于交错控制器,不同之处在于它不是按顺序通过其子控制器和采样器,而是在每次通过时随机选取一个。

另外,需注意,多个控制器之间的交互会产生复杂的行为。随机控制器尤其如此。在假设任何给定的交互都会产生什么结果之前,要先进行测试调试。

image-20230315120630907

6、随机顺序控制器

随机顺序控制器很像简单控制器,因为它最多执行一次每个子元件,但节点的执行顺序是随机的。

image-20230315121010680

7、吞吐量控制器

吞吐量控制器允许用户控制执行的频率。有两种模式:

Percent executions:使控制器在测试计划中执行一定百分比的迭代。

Total executions:使得控制器在发生一定数量的执行之后停止执行。

仅一次控制器类似,此设置在父循环控制器重新启动时重置。此控制器的名称不正确,因为它不控制吞吐量。有关可用于调整吞吐量的元件,因该是吐量定时器

吞吐量控制器在与其他控制器组合时会产生非常复杂的行为,特别是与交织或随机控制器作为父控制器(也非常有用)。

image-20230315123156284

8、Runtime控制器

Runtime控制器控制其子级将运行多长时间。控制器将运行其子级,直到超过配置的运行时。

image-20230315123439190

9、If 控制器

If 控制器允许用户控制其下面的测试元素(其子项)是否运行。

image-20230315145914099

对于其中的布尔变量表达式的填写而言,常用的布尔表达式脚本如下:


${__groovy(vars.get("myVar") != "Invalid" )} (Groovy检查 myVar变量的值不等于字符串“Invalid”)
${__groovy(vars.get("myInt").toInteger() <=4 )} (Groovy检查 myInt变量的值小于等于4)
${__groovy(vars.get("myMissing") != null )} (Groovy 检查 myMissing变量是否为空)
${__jexl3(${COUNT} < 10)}(计算COUNT变量的值是否小于10)
${RESULT}(返回RESULT变量的值,RESULT必须是布尔值)
${JMeterThread.last_sample_ok} (检查采样器最近一次运行结果是否PASS)

另外,当变量表达式执行出错时,将直接返回false,同时记录一条日志在jmeter.log文件中,关于__groovy()函数和__jexl3()函数的详细定义,见__jexl3__groovy,其主要用于提高JMeter的运行性能,这两者在使用上最大的不同在于groovy()必须要与vars.get(自定义的变量名)结合使用

10、While控制器

While 控制器运行其子级,直到条件为“false”,类似于python中的while语句。While 控制器公开索引的取名原则同循环控制器,关于此点见本文 四.2 循环控制器

image-20230315152310947

常用变量表达式示例如下:

${VAR}-其中VAR被其他测试元素设置为false
${__jexl3(${C}==10)}
${__jexl3("${VAR2}"=="abcd")}
${_P(property)} - 其中property在其他地方设置为“false”

11、Switch控制器

Switch控制器的作用类似于交替控制器,因为它在每次迭代中运行一个从属元素,但控制器不是按顺序运行它们,而是运行由切换值定义的元素;类似于Java/C语言中的switch语句。

image-20230315153903077

12、Foreach控制器

ForEach控制器循环遍历一组相关变量的值。当采样器(或控制器)添加到ForEach控制器时,每个采样(或者控制器)都会执行一次或多次,其中在每个循环期间,变量都有一个新值。输入应由多个变量组成,每个变量都用下划线和数字扩展。每个这样的变量都必须有一个值。

image-20230315162717288

以下图为例说明,更细致的示例下载官网原jmx文件自行调试体会:

image-20230315164512056

image-20230315164940911

13、模块控制器(类似python的函数调用)

模块控制器提供了一种机制,用于在运行时将测试计划片段替换到当前测试计划中。相当于python中的函数调用引用。

另外,在测试计划中,只有逻辑控制器下的子节点集或测试片段元件才能称之为模块,相当于python中的函数,才能在模块控制器中被之选择调用。

image-20230315171916148

示例如下:

image-20230315171950441

14、Include控制器(类似python的import)

Include控制器引用外部已保存为.jmx文件的测试计划作为当前测试计划的一部分,类似于python中的import。但有以下几点需注意:

  • 被引用的测试计划的线程组将在包含过程中被忽略;
  • 如果测试使用Cookie管理器或用户定义变量,则应将其放在顶级测试计划中,而不是包含的文件中,否则无法保证其正常工作;
  • 当两个Include控制器包含同一个JMX文件时,这两个Include控制器命名必须不同

image-20230315173607801

15、事务控制器(统计场景响应时间)

事务控制器生成一个额外的样本,用于测量执行嵌套测试元件所花费的总时间。可用于涉及多个接口请求的业务进行计时统计,事务响应时间是性能测试中衡量业务性能的主要指标。事务即场景,可以将多接口串联的场景自动的分类显示,更易于分类识别整个场景的响应时间。

image-20230315220852425

以下图为例进行说明,以下测试树为添加用户的业务,共涉及两个接口,登录接口、添加用户接口,即模拟管理员登录账号后添加用户的场景(业务/事务):

image-20230315230354631

image-20230315230420248

image-20230315230445365

16、录制控制器

录制控制器是一个占位符,指示代理服务器应该将样本记录到哪里。在测试运行期间,它没有任何效果,类似于简单控制器。但在使用HTTP(S)测试脚本记录器进行录制时,默认情况下,所有录制的样本都将保存在录制控制器下。

image-20230315232143933

录制控制器常与JMeterHTTP代理服务器元件组合使用,如下图:

(1)配置JMeter代理:

image-20230315232606064

(2)配置系统代理(WIN10为例):

image-20230315232712471

(3)配置浏览器代理(Firefox版本: 111.0 (64 位)为例):

image-20230315232938941

(4)启动JMeter代理:

image-20230315233027111

(5)访问测试网站:

image-20230315233300630

(6)测试完后,停止JMeter代理服务器,还原所有代理设置:

此时可以看到,录制的各请求已经保存到录制控制器下了,点击运行,即可直接查看运行结果:

image-20230315233715529

结果查看:

image-20230315233847751

image-20230315233917874

17、临界部分控制器(Critical Section Controller)

临界部分控制器确保其子元素(采样器/控制器等)将仅由一个线程执行,进而控制各并发线程请求的顺序是一样的,因为在执行控制器的子元素之前将获取命名锁。

image-20230316140206290

以下部分参考自:https://blog.youkuaiyun.com/qq_38368494/article/details/125841424

临界部分控制器,本质上是一个锁,对于多线程的线程组而言,同层级无逻辑控制器控制的取样器,执行顺序是按从上往下的顺序执行的,但在多用户并发时,每一个并发用户(线程),也都是从上往下执行的,只是因为是并发,同一时刻,可能有不同用户(线程)做完了不同接口请求,而查看结果树只是按照完成时间的先后显示请求结果。

并发请求(线程)这个控制器时,会先根据‘锁名称’生成一个‘锁’,锁定控制器下的所有子元素,等到所有子元素都执行完‘锁’才会释放,下一个请求(线程)才能执行,即,把原本的并发请求的并行处理方式,变成了串行处理。

可以使用随机数函数、时间戳函数、线程数函数等自动生成值的函数就可以修改critical section controller的锁名称为动态值,当某个线程调用时,就会自动生成一个新的锁名称。

如以下,按线程数动态生成锁名称:

image-20230316140243575

五、常用监听器

除了监听测试结果之外,大多数监听器还提供了查看、保存和读取保存的测试结果的方法。请注意,侦听器是在其所在范围的末尾进行处理的。另外,所有含GUI页面的监听器都不得在负载测试期间使用,因为它们会消耗大量资源(内存和CPU),仅在功能测试或测试计划调试和验证期间使用它们。

image-20230316151718569

测试结果的保存和读取是通用的。不同的监听器有一个面板,可以通过该面板指定将向其中写入(或从中读取)结果的文件。默认情况下,结果存储为XML文件,通常扩展名为“.jtl”。以CSV形式存储是最有效的选项,但不如XML(另一种可用选项)详细。

侦听器不以CLI模式处理示例数据,但如果配置了输出文件,则会保存原始数据。为了分析CLI运行生成的数据,需要将文件加载到相应的监听器中。

要读取现有结果并显示它们,可在监听器的“文件”面板“浏览”按钮打开文件。

image-20230316150252567

1、图形结果(Graph Results)

图形结果监听器生成一个简单的图,用于绘制所有采样时间。沿着图的底部,以毫秒为单位显示当前样本(黑色)、所有样本的当前平均值(蓝色)、当前标准偏差(红色)和当前吞吐率(绿色)。

吞吐量数字表示服务器每分钟处理的实际请求数。此计算包括添加到测试中的任何延迟以及JMeter自己的内部处理时间。这样计算的好处是,这个数字代表了真实的东西——事实上,被测试的服务器每分钟处理那么多请求,测试人员可以增加线程数量和/或减少延迟,以发现服务器的最大吞吐量。然而,如果测试人员进行的计算考虑了延迟和JMeter的处理,那么就不清楚从这个数字中能得出什么结论。

image-20230316145519899

2、断言结果(Assertion Results)

断言结果显示每个采样的标签。它还报告作为测试计划一部分的任何断言的失败。如下图:

image-20230316151231985

3、察看结果树(View Results Tree)

察看结果树显示所有样本响应的树,允许查看任何样本的响应。除了显示响应之外,还可以看到获得此响应所花费的时间,以及一些响应代码。请注意,Request面板仅显示JMeter添加的头。它不显示HTTP协议实现可能添加的任何标头(如Host)。

此页面有非常丰富的响应结果查看器及测试器,以便在设置响应断言时进行调试(如正则、Json表达式、JQuery、Xpath等),更多用法见官网View Results Tree

image-20230316152810901

4、聚合报告(Aggregate Report)

聚合报告为测试中每个不同名称的请求创建一个表行。对于每个请求,它汇总响应信息,并提供请求计数、最小值、最大值、平均值、错误(异常)率、近似吞吐量(请求/秒)和千字节每秒吞吐量。一旦测试完成,吞吐量就是整个测试期间的实际吞吐量。

吞吐量是从采样器目标(例如,在HTTP采样的情况下是远程服务器)的角度计算的。JMeter会考虑生成请求的总时间。如果其他采样器和定时器在同一个线程中,那么它们将增加总时间,从而降低吞吐量值。因此,两个具有不同名称的相同采样器的吞吐量将是两个具有相同名称的采样器的一半。正确选择采样器名称以从“聚合报告”中获得最佳结果非常重要。

中位数和90的计算 % 行(第90百分位)值需要额外的内存。JMeter现在将具有相同运行时间的样本组合在一起,因此使用的内存要少得多。然而,对于花费几秒钟以上的样本,有可能更少的样本具有相同的时间,在这种情况下,需要更多的内存。请注意,您可以在之后使用此侦听器重新加载CSV或XML结果文件,这是避免性能影响的推荐方法。请参阅摘要报告,了解类似的侦听器,该侦听器不存储单个样本,因此需要恒定内存。

image-20230316160414385

5、汇总图(Aggregate Graph)

汇总图聚合报告类似,主要区别在于汇总图提供了一种生成条形图并将图保存为PNG文件的简单方法。

image-20230316164931245

生成的图表如下:

image-20230316171134443

6、汇总报告(Summary Report)

摘要报告为测试中每个不同名称的请求创建一个表行,这与聚合报告类似,只是它使用的内存较少。其中吞吐量的计算方式与聚合报告是一样的。

image-20230316195042253

7、用表格查看结果(View Results in Table)

此监听器为每个样本结果创建一行。与查看结果树一样,此可视化工具使用大量内存。

image-20230316161634801

8、简单数据写入器(Simple Data Writer)

这个监听器可以将结果记录到文件中,但不能记录到UI中。它旨在通过消除GUI开销来提供一种高效的数据记录方式。在CLI模式下运行时,-l选项可用于创建数据文件。要保存的字段由JMeter属性定义,有关详细信息,请参阅jmeter.properties文件。

image-20230316162156998

9、响应时间图(Response Time Graph)

响应时间图绘制了一个折线图,显示了测试期间每个标记请求的响应时间的演变。如果同一时间戳存在多个样本,则显示平均值。

image-20230316172042919

运行测试计划后,图例如下:

image-20230316172621839

六、常用定时器

请注意,在发现计时器的范围内,计时器在每个采样器之前进行处理;如果在同一范围内有多个计时器,则所有计时器都将在每个采样器之前进行处理。 计时器只能与采样器一起处理。与采样器不在同一范围内的计时器根本不会被处理。 要将计时器应用于单个采样器,请将计时器添加为采样器的子元素。计时器将在执行采样器之前应用。要在采样器之后应用计时器,可以将其添加到下一个采样器,也可以将其作为测试活动(Flow Control Action)采样器的子采样器添加。

1、固定定时器(Constant Timer)

此定时器用于在每个线程在请求之间暂停相同的时间。

以下图所示的测试树为例:

image-20230317161256282

设置固定定时器时:

image-20230317161349077

不设置时:

image-20230317161419733

2、高斯随机定时器(Gaussian Random Timer)

此定时器的作用与固定定时器一样,不同点在于此定时器的暂停时间不是固定的,而是发生在固定时间附近的符合高斯分布的随机时间,用于模拟压测时的思考时间

image-20230317162232644

3、统一随机定时器(Uniform Random Timer)

此定时器作用及延时时间的产生同高斯随机定时器,不同在于此定时器产生的随机延时的时间间隔的概率是一样的,总延迟是随机值和偏移值的总和。

image-20230317163211027

4、常数吞吐量定时器(Constant Throughput Timer)

这个定时器引入了可变的暂停,计算的目的是使总吞吐量(以每分钟样本数计)尽可能接近给定的数字,即用于控制JMeter的吞吐量,当然,如果服务器无法处理,或者其他定时器或耗时的测试元素阻止了吞吐量,吞吐量会更低

以下源自官网的文档有些费解,生动易理解的例子参考链接:https://blog.youkuaiyun.com/qq_15055139/article/details/124615470。

image-20230317173515119

共享和非共享算法都旨在产生所需的吞吐量,并将产生类似的结果。 共享算法应该生成更准确的整体交易速率。 非共享算法应该在线程之间生成更均匀的事务分布。

5、同步定时器(Synchronizing Timer),LR中的集合点

同步定时器的目的是阻止线程,直到X个线程被阻止,然后一次释放所有线程。因此,同步定时器可以在测试计划的各个点创建大的即时负载。

image-20230317175224716

从35个方面对Jmeter从原理到实际演示,一册在手,天下我有 1.性能测试基本概念 1.1.RT -Response time 请求响应时间 从客户端发出请求到得到响应的整个时间 一般包括网络响应时间+server的响应时间。 用户接受准则: 例如2-5-10原则,即按照正常用户体验,如果用户能够在2秒内得到响应,会感觉速度很快,如果2-5秒得到响应,用户感觉系统的响应速度还不多,在5-10秒之内得到响应时,用户会感觉系统的响应速度慢,但是可以接受,超过10秒后还没有响应,用户就会感觉不能够接受。 不同行业不同业务可接受的响应时间是不同的,一般情况,对于在线实时交易: 互联网企业:500毫秒以下,例如淘宝业务10毫秒左右。 金融企业:1秒以下为佳,部分复杂业务3秒以下。 保险企业:3秒以下为佳。 制造业:5秒以下为佳。 1.2.系统处理能力 系统处理能力是指系统在利用系统硬件平台和软件平台进行信息处理的能力。系统处理能力通过系统每秒钟能够处理的交易数量来评价,交易有两种理解: 一是业务人员角度的一笔业务过程; 二是系统角度的一次交易申请和响应过程。 前者称为业务交易过程,后者称为事务。两种交易指标都可以评价应用系统的处理能力。一般的建议与系统交易日志保持一致,以便于统计业务量或者交易量。系统处理能力指标是技术测试活动中重要指标。 1.1.1.简称 一般情况下,用以下几个指标来度量: HPS(Hits Per Second) :每秒点击次数,单位是次/秒。 TPS(Transaction per Second):系统每秒处理事务数,单位是笔/秒。吞吐量。 不可分割的。要么完全成功,要么完全失败。 QPS(Query per Second):系统每秒处理查询次数,单位是次/秒。 对于互联网业务中,如果某些业务有且仅有一个请求连接,那么TPS=QPS=HPS, 一般情况下用TPS来衡量整个业务流程,用QPS来衡量接口查询次数,用HPS来表示对服务器点击请求。 每秒钟处理完的事务次数,一般TPS是对整个系统来讲的。一个应用系统1s能完成多少事务处理,一个事务在分布式处理中,可能会对应多个请求,对于衡量单个接口服务的处理能力,用QPS比较多。 1.1.2.标准 无论TPS、QPS、HPS,此指标是衡量系统处理能力非常重要的指标,越大越好,根据经验,一般情况下: 金融行业:1000TPS~9000TPS,不包括互联网化的活动 保险行业:100TPS~1000TPS,不包括互联网化的活动 制造行业:10TPS~50TPS 互联网电子商务:10000TPS~100000TPS,例如天猫5万TPS 互联网中型网站:100TPS~500TPS 互联网小型网站: 50TPS~100TPS 1.3.并发用户数量 常见的错误理解: 使用系统的全部用户数量(注册用户) 使用系统的全部在线用户数量 正确理解 并发用户数指在同一时刻内,打开系统并进行业务操作的用户数量,并发用户数对于长连接(数据库连接时长连接,web请求时短连接)系统来说最大并发用户数即是系统的并发接入能力。对于短连接系统而言最大并发用户数并不等于系统的并发接入能力,而是与系统架构、系统处理能力等各种情况相关 http:请求只能由客户端发出,服务端被动响应。 1.1.3. 简称 Virtual User: VU 1.1.4.标准 一般情况下,性能测试是将系统处理能力容量测出来,而不是测试并发用户数,除了服务器长连接可能影响并发用户数外,系统处理能力不完全受并发用户数影响,可以用最小的用户数将系统处理能力容量测试出来,也可以用更多的用户将系统处理能力容量测试出来。 并发用户数量: 并发用户多少为好? 中小企业:5000用户 1.4.错误率 1.1.5. 定义及解释 错误率指系统在负载情况下,失败交易的概率。错误率=(失败交易数/交易总数)*100%。稳定性较好的系统,其错误率应该由超时引起,即为超时率。 1.1.6.标准 不同系统对错误率的要求不同,但一般不超出千分之六,即成功率不低于99.4% 1.5.CPU 定义及解释 中央处理器是一块超大规模的集成电路,是一台计算机的运算核心(Core)和控制核心( Control Unit)。它的功能主要是解释计算机指令以及处理计算机软件中的数据。CPU Load: 系统正在干活的多少的度量,队列长度。系统平均负载。 CPU指标主要指的CPU利用率,包括用户态(user)、系统态(sys)、等待态(wait)、空闲态(idle)。CPU 利用率要低于业界警戒值范围之内,即小于或者等于75%;CPU sys%小于或者等于30%, CPU wait%小于或者等于5%。单核CPU也需遵循上述指标要求。 7*24不允许宕机 1.6. Memory 内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大。 现代的操作系统为了最大利用内存,在内存中存放了缓存,因此内存利用率100%并不代表内存有瓶颈,衡量系统内有有瓶颈主要靠SWAP(与虚拟内存交换)交换空间利用率,一般情况下,SWAP交换空间利用率要低于70%,太多的交换将会引起系统性能低下。 Swap解释: 当物理内存接近崩溃时,将物理内存中最近一段时间最少频率使用到的页框移出物理内存,放进该存储空间,这段存储空间我们称之为交换空间(Swap) 1.7.磁盘吞吐量 Disk Throughput. 磁盘吞吐量是指在无磁盘故障的情况下单位时间内通过磁盘的数据量。 磁盘指标主要有每秒读写多少兆,磁盘繁忙率,磁盘队列数,平均服务时间,平均等待时间,空间利用率。其中磁盘繁忙率是直接反映磁盘是否有瓶颈的的重要依据,一般情况下,磁盘繁忙率要低于70%。 1.8.网络吞吐量 Network Throughput 10Mbit带宽,每秒传输的字节数1.25MBytes 网络吞吐量是指在无网络故障的情况下单位时间内通过的网络的数据数量。单位为Byte/s。网络吞吐量指标用于衡量系统对于网络设备或链路传输能力的需求。当网络吞吐量指标接近网络设备或链路最大传输能力时,则需要考虑升级网络设备。 网络吞吐量指标主要有每秒有多少兆流量进出,一般情况下不能超过设备或链路最大传输能力的70%。 2.性能测试基本流程 性能测试需求: 1)最终用户体验,例如2-5-10原则,即按照正常用户体验,如果用户能够在2秒内得到响应,会感觉速度很快,如果2-5秒得到响应,用户感觉系统的响应速度还不多,在5-10秒之内得到响应时,用户会感觉系统的响应速度慢,但是可以接受,超过10秒后还没有响应,用户就会感觉不能够接受。 2)技术需求, cpu,内存,网络吞吐量,磁盘吞吐量 3)标准要求: 竞品分析- 响应时间 互联网企业:500毫秒以下,例如淘宝业务10毫秒左右。 金融企业:1秒以下为佳,部分复杂业务3秒以下。 保险企业:3秒以下为佳。 制造业:5秒以下为佳。 TPS 金融行业:1000TPS~9000TPS,不包括互联网化的活动 保险行业:100TPS~1000TPS,不包括互联网化的活动 制造行业:10TPS~50TPS 互联网电子商务:10000TPS~100000TPS,例如天猫5万TPS 互联网中型网站:100TPS~500TPS 互联网小型网站: 50TPS~100TPS 性能测试计划 测试环境,测试需求,测试方法,测试时间表,测试组织架构,测试风险,输入输出文档 性能测试步骤: 性能测试执行 3.性能测试工具 4.Jmeter简介 4.1.Jmeter的基本概念 Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。 它可以用于测试静态和动态资源,例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库、FTP 服务器, 等等。JMeter 可以用于对服务器、网络或对象模拟巨大的负载,来自不同压力类别下测试它们的强度和分析整体性能。另外,JMeter能够对应用程序做功能/回归测试,通过创建带有断言的脚本来验证你的程序返回了你期望的结果。为了最大限度的灵活性,JMeter允许使用正则表达式创建断言 4.2.我们为什么使用Jmeter 开源免费还很好用,基于Java编写,可集成到其他系统可拓展各个功能插件 支持接口测试,压力(负载和压力)测试等多种功能,支持录制回放,入门简单 相较于自己编写框架活其他开源工具,有较为完善的UI界面,便于接口调试 多平台支持,可在Linux,Windows,Mac上运行 5.Jmeter安装配置及目录结构 5.1.Windows下Jmeter下载安装 登录 http://jmeter.apache.org/download_jmeter.cgi ,根据自己平台,下载对应文件 安装JDK,配置环境变量(具体步骤不做介绍) 将下载Jmeter文件解压,打开/bin/jmeter.bat 5.2.Jmeter的目录结构 /bin 目录(常用文件介绍) examples:目录下包含Jmeter使用实例 ApacheJMeter.jar:JMeter源码包 jmeter.bat:windows下启动文件 jmeter.sh:Linux下启动文件 jmeter.log:Jmeter运行日志文件 jmeter.properties:Jmeter配置文件 jmeter-server.bat:windows下启动负载生成器服务文件 jmeter-server:Linux下启动负载生成器文件 /docs目录——Jmeter帮助文档 /extras目录——提供了对Ant的支持文件,可也用于持续集成 /lib目录——存放Jmeter依赖的jar包,同时安装插件也放于此目录 /licenses目录——软件许可文件,不用管 /printable_docs目录——Jmeter用户手册 6.Jmeter简单入门 6.1.修改语言 6.2.创建测试计划 6.3.添加线程组 6.4.添加sampler设置http请求 6.5.添加结果树 6.6.查看结果 7.测试计划 独立运行每个线程组: 再每一组运行结束后启动下一个 Run tearDown Thread Groups after shutdown of main threads:   主线程关闭运行后拆除线程组, 8.线程组 Delay Thread creation until needed                延迟创建线程,直到该线程开始采样,即之后的任何线程组延迟和加速时间为线程本身。这样可以支持更多的线程,但不会有太多是同时处于活动状态。  持续时间(秒):测试计划持续多长时间,会覆盖结束时间。  启动延迟(秒):测试计划延迟多长时间启动,会覆盖启动时间。 9.Sampler --HTTP请求 请求方式 请求路径 请求ip 请求协议 请求编码 重定向之前的和之后的请求都会在结果树中显示出来 自动重定向,只会显示重定向之后的地址。 10.结果收集 10.1.查看结果树 10.2.表格查看结果 偏离表示服务器响应时间变化、离散程度测量值的大小,或者,换句话说,就是数据的分布。 10.3.聚合报告 10.4.Summary Report 11.Jmeter参数化 11.1.用户定义的变量 使用配置原件中用户定义的变量可以进行参数化 11.2.用户参数 使用前置管理器设置用户参数 11.3.使用csv配置原件 配置元件(Config E
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值