JMeter

介绍

Apache JMeter 是一个开源的性能测试工具,最初用于测试 Web 应用的负载性能。随着功能的不断扩展,JMeter 现在支持多种协议和技术,是性能测试、负载测试和功能测试的利器。

基于 Java 开发,可以在 Windows、Linux、macOS 等系统上运行。

用途

  1. 性能测试: 模拟多个用户并发访问系统,测试系统在高负载下的性能。
  2. 负载测试: 测试服务器的吞吐量和响应时间,发现性能瓶颈。
  3. 压力测试: 模拟超出系统承受能力的访问,观察系统在压力下的行为。
  4. 功能测试: 测试接口、API 是否按照预期运行。
  5. 回归测试: 自动化测试脚本,用于检测功能更新后的影响。
  6. 协议测试: 支持 HTTP、FTP、TCP、MQ 等协议,适用于多种测试需求。

架构

  1. 线程组(Thread Group): 定义并发用户数、启动时间间隔和循环次数。
  2. 取样器(Sampler): 用于发起请求,比如 HTTP 请求、数据库查询等。
  3. 配置元件(Config Element): 提供测试数据或配置,比如 CSV 数据集、HTTP Header 等。
  4. 逻辑控制器(Logic Controller): 定义测试的流程控制逻辑,比如条件、循环等。
  5. 监听器(Listener): 用于收集测试结果,如图表、日志等。
  6. 断言(Assertion): 验证响应结果是否符合预期。
  7. 定时器(Timer): 控制请求之间的延迟,模拟真实用户行为。

组件

线程组

线程组(Thread Group)是 JMeter 测试计划的基础组件,用于定义用户模拟的数量、行为和测试持续时间。简单来说,线程组决定了测试中虚拟用户的数量、执行时间和并发模式。

常见的线程组有4个:普通线程组、setUp线程组、tearDown线程组、开放模型线程组。

setUp线程组

主要用于在性能测试开始前进行一些初始化操作。

用途

  • 配置数据库连接池
  • 初始化共享资源
  • 预加载数据
  • 执行登录操作等

特点

  • 执行顺序setUp​ 线程组会在 测试计划 中的其他线程组之前执行。
  • 线程数:通常设置为 1 个线程,因为 setUp​ 主要用于环境初始化,只需要一个线程执行初始化操作即可。
  • 循环次数:通常为 1,因为初始化操作只需要执行一次。

tearDown线程组

主要用于在测试结束后进行一些清理工作。

用途

  • 关闭数据库连接
  • 清理临时文件
  • 执行注销操作
  • 清理测试过程中创建的资源等

特点

  • 执行顺序tearDown​ 线程组会在所有测试完成后执行,确保在所有负载测试结束后进行清理操作。
  • 线程数:通常设置为 1 个线程,因为 tearDown​ 的操作也仅需要一个线程来执行清理工作。
  • 循环次数:通常为 1,因为清理操作只需执行一次。

普通线程组

用来模拟并发用户进行负载测试的核心部分,包含所有的实际测试场景。它模拟的用户会执行实际的业务操作,如发送请求、执行 SQL 查询等。

用途

  • 模拟并发用户:创建多个虚拟用户并模拟它们的行为。
  • 执行业务流程:模拟不同的业务场景和负载模式,如登录、查询、购买等。
  • 进行负载测试、压力测试:模拟大量并发请求,测试系统的性能和稳定性。

特点

  • 执行顺序Thread Group​ 会在 setUp​ 线程组执行完后执行,并且在 tearDown​ 线程组执行之前运行。
  • 线程数:线程数通常根据负载测试的需要来配置,模拟多个并发用户进行测试。
  • 循环次数:根据负载需求,设置每个线程的循环次数,可以模拟用户进行重复操作。

开放模型线程组

它的线程数不固定,而是根据线程启动和停止的方式动态调整。这使得它特别适用于需要 持续不确定时长 的负载测试。

用途

  • 压力测试与长期负载模拟:适用于模拟长时间运行且负载不断增加的场景。例如,模拟一个网站在 24 小时内的高并发流量。
  • 逐步增加并发量:在负载测试中,开放线程组​ 可以逐步增加线程的数量,模拟并发量逐渐升高的情况,帮助测试系统在不同负载下的表现。
  • 持续负载测试:如果你希望测试系统在长时间内持续承受负载,可以通过设置线程的持续时间来模拟高并发持续操作。例如,模拟某个服务在一小时内的高并发访问。

特点

  1. 线程数动态变化:与普通线程组中的线程数设置固定不同,开放线程组​(Open Model Thread Group)是通过 按时间控制线程的启动与停止 来动态增加或减少线程的数量。
  2. 并发量控制方式:在指定的时间内逐渐增加线程数量,或者让线程以某种方式持续运行,直到达到某个目标。
  3. 适用于压力测试:可以持续运行多个线程,模拟较长时间内的高并发场景,适合压力测试或稳定性测试。
  4. 线程启动模式:线程的启动时间、数量等由用户在 开放线程组​ 配置中设定,通常不是一个简单的恒定数量的线程。

配置项

前三个的配置项基本一致,包含如下配置:

  • 取样器错误(Action to be taken after a Sampler error)

    • 当取样器(Sampler)出现错误时,我们可以通过配置不同的 后续动作 来控制在错误发生后应该执行哪些操作。
    • 例如默认为继续,则继续执行测试计划中的下一个取样器,即使当前取样器失败。
  • 线程数(Number of Threads, Users)

    • 表示虚拟用户数,每个线程模拟一个用户。
    • 例如设置为 100,则 JMeter 会模拟 100 个用户并发访问。
  • Ramp-Up 时间(Ramp-Up Period)

    • 表示所有线程启动所需的时间(以秒为单位)。
    • 例如设置为 20 秒,100 个线程会在 20 秒内均匀启动,即每秒启动 5 个线程。
  • 循环次数(Loop Count)

    • 指定每个线程执行的循环次数。
    • 设置为 Forever​ 永远 时线程会持续执行,直到手动停止。
  • 调度器配置(Scheduler)

    • 开始时间结束时间:指定线程组的运行时间范围。
    • 持续时间(Duration) :设置线程组运行的总时长。
    • 启动延迟(Startup Delay) :设置线程组启动前的等待时间。

开放模型线程组的配置项:主要是配置不同时间段的调度计划,根据调度计划曲线动态执行。

取样器

取样器(Sampler)是执行实际请求的组件,用来模拟客户端向服务器发起请求。每个取样器都可以根据配置发起特定类型的请求,JMeter 会将请求的响应数据收集并返回给你,以便进行进一步的分析。

HTTP 请求取样器

模拟用户通过 HTTP 协议向服务器发送请求,适用于 Web 应用程序性能测试。

常见配置项

  • 协议(Protocol) :指定使用的协议,如 http​ 或 https​。
  • 服务器名称或IP(Server Name or IP) :指定服务器的地址。
  • 端口号(Port Number) :指定服务器的端口号,默认为 80(HTTP)或 443(HTTPS)。
  • 路径(Path) :请求的路径,类似于 URL 中的 /api/login​ 部分。
  • 请求方法(Method) :选择请求类型,如 GET​、POST​、PUT​、DELETE​ 等。
  • 请求参数(Parameters) :设置请求参数,适用于 POST​ 请求或带有查询参数的 GET​ 请求。
  • 请求体(Body Data) :对于 POST​ 请求,设置请求体的内容。

JDBC 请求取样器

用于测试与数据库的连接,模拟执行 SQL 查询、插入、更新等操作。

常见配置项

  • JDBC 驱动类(JDBC Driver Class) :指定 JDBC 驱动类,例如 com.mysql.cj.jdbc.Driver​(MySQL)。
  • JDBC 连接 URL(Database URL) :数据库的连接 URL,例如 jdbc:mysql://localhost:3306/test_db​。
  • 用户名(Username) :数据库用户名。
  • 密码(Password) :数据库密码。
  • SQL 查询(SQL Query) :要执行的 SQL 语句,例如 SELECT * FROM users​。

BeanShell 取样器

通过 BeanShell 脚本执行自定义的 Java 代码,可以在测试中嵌入自定义逻辑。

常见配置项

  • 脚本(Script) :在 BeanShell 中编写的代码。例如:计算某个值、记录日志等。

FTP 请求取样器

用于测试 FTP 服务,模拟用户通过 FTP 协议与服务器进行文件传输操作(上传或下载文件)。

常见配置项:

  • 协议ftp
  • 服务器名称或 IP:FTP 服务器的地址。
  • 端口号:FTP 服务器的端口号,默认为 21。
  • 文件路径(File Path) :文件的路径,如 /files/test.txt​。
  • 操作类型:选择文件操作类型,如 GET​、PUT​ 等。

Java 请求

使用 Java 类和方法执行自定义的 Java 操作,可以在 JMeter 测试中执行自定义的业务逻辑。

常见配置项

  • 类名称:要调用的 Java 类。
  • 方法名称:类中的方法。
  • 参数:方法所需的参数。

逻辑控制器

逻辑控制器(Logic Controller)用于控制测试执行流程。它可以定义不同的请求(取样器)执行顺序、执行次数、随机性等。逻辑控制器本质上并不发送请求,而是控制包含在其中的 取样器(Sampler)的执行方式。

简单控制器

简单控制器是最基本的逻辑控制器,它按照一定的顺序执行其中的所有子元素。它不会对执行流程产生其他影响,基本上只是用来组织取样器或其他控制器的容器。

特点

  • 顺序执行:它会顺序执行所有包含在其下的取样器、定时器等组件。
  • 无条件执行:它没有任何条件或逻辑,简单地按照添加顺序执行。

用法示例

假设你想组织两个 HTTP 请求,可以使用一个 简单控制器 来包含这两个请求:

  • 第一个 HTTP 请求:GET /home
  • 第二个 HTTP 请求:GET /about

常见用途

  • 组织多个请求或控制器,方便管理。
  • 简单的顺序执行场景。

仅一次控制器

用于确保其下的取样器只执行一次。即使线程组或循环的次数很高,Once Only Controller​ 下的请求也仅执行一次。这种控制器非常适用于测试中需要执行一次的操作,例如登录、初始化操作或其他只需要执行一次的任务。

特点

  • 只执行一次:它确保其下的所有取样器和组件在每个线程的生命周期中只执行一次,无论线程数或循环次数如何。
  • 无条件执行:它不受线程组或循环控制器等其他控制器的影响,始终只执行一次。

用法示例

假设你希望执行一次用户登录请求,然后在此之后进行其他请求,可以使用 仅一次控制器 来包含登录请求:

  • 第一个 HTTP 请求:POST /login​ (此请求将只执行一次)
  • 第二个 HTTP 请求:GET /home
  • 第三个 HTTP 请求:GET /profile

常见用途

  • 执行仅需要执行一次的操作,如用户登录、系统初始化等。
  • 控制某些请求仅执行一次,以减少重复操作,避免影响测试结果。
  • 组织需要在测试开始时执行的单次操作,例如数据库连接、文件上传等。

循环控制器

循环控制器用于将一组请求或操作反复执行指定次数。它非常适合用来模拟重复的用户行为。

常见配置项

  • 循环次数(Loop Count) :指定循环执行的次数。如果选择了 forever​,则会无限次循环,直到手动停止。
  • 嵌套循环:可以在循环控制器中嵌套其他逻辑控制器和取样器,进行更加复杂的循环场景。

用法示例

假设你要模拟用户在登录后的重复操作,例如多次查询用户信息:

  • 配置循环控制器的 Loop Count​ 为 5,表示每个线程执行 5 次请求。

常见用途

  • 模拟用户的重复行为,如多次提交表单、查询操作等。
  • 测试时模拟持续操作的用户负载。

ForEach控制器

特点

  • 循环执行ForEach 控制器​ 用于在 JMeter 测试计划中循环执行其下的取样器或控制器。它能够根据输入的列表或数组,逐一遍历并执行相应的请求。
  • 动态参数化:可以使用变量或外部数据(如 CSV 数据)来填充需要循环的数据集,常用于数据驱动测试。
  • 灵活性:它的功能可以通过设置属性(例如循环的次数或从外部源获取数据)进行定制化,灵活地控制每个线程的执行行为。

常见配置项

  • 输入项(Input items) :定义循环的数据集,可以是一个变量或由外部文件提供的数据(例如 CSV 文件)。每个数据项会作为一次循环的输入,通常通过 JMeter 变量、CSV 数据文件等方式传递。
  • 输出变量(Output variable) :在每次循环中,当前数据项会被赋值给该输出变量,以便在后续的请求中使用。
  • 开始索引(Start index)结束索引(End index) :定义循环的起始位置和结束位置,用于控制从数据集中选择循环的范围。
  • 逗号分隔或换行分隔(Comma or newline separated) :选择数据项是通过逗号还是换行符分隔。

条件控制器

条件控制器根据指定的条件判断是否执行其下的取样器。如果条件满足(返回 true​),则执行取样器;否则跳过。

常见配置项

  • 条件表达式(Condition) :根据 JMeter 变量或系统属性编写条件,通常使用 BeanShellJEXL 表达式。

用法示例

假设你只想在登录请求成功后才继续进行下一步操作(如查询请求):

  • 使用 If Controller,条件设置为 ${login_response_code} == 200​,即只有登录请求返回 200​ 时才执行查询操作。

常见用途

  • 控制是否执行某些操作,如基于先前请求的响应来决定是否继续执行后续请求。
  • 模拟根据某些条件进行决策的业务逻辑。

吞吐量控制器

是 JMeter 中用于控制每秒请求数(吞吐量)的逻辑控制器。它可以帮助你模拟特定吞吐量的负载场景,或者指定请求的执行频率。在进行性能测试时,吞吐量控制器可以确保在测试期间请求的执行速度与系统的负载需求保持一致。

常见配置项

  1. Based on:

    • 设置期望的吞吐量的类型,可以是总计(Total Execution),也可以是百分比(Percent Execution)。
  2. Throughput:

    • 根据设置的吞吐量的类型给定数值,如共1000并发,可以分配,总计:200或百分比:20。

随机控制器

随机控制器随机选择其下的请求或操作进行执行,可以用来模拟用户随机访问不同的页面或资源。

常见配置项

  • 随机选择的取样器:选择执行随机的取样器或请求。

用法示例

假设你有多个 HTTP 请求(如访问不同的网页),使用 随机控制器 来模拟随机访问这些页面。

  • 每次执行时,JMeter 会随机选择一个请求执行。

常见用途

  • 模拟随机访问不同页面的用户行为。
  • 模拟真实用户在多个选项间随机选择的场景。

模块控制器

模块控制器用于执行外部的测试模块,它可以用来复用已经定义的其他测试计划中的请求或控制器。

常见配置项

  • 模块名称:指定要引用的模块。

用法示例

假设你有一个登录模块,并希望在多个场景中复用该模块,可以使用 模块控制器 来调用该模块。

常见用途

  • 模块化测试,复用已有的测试场景。
  • 在多个测试计划中共享相同的请求或操作。

事务控制器

事务控制器用于测量一组请求的总响应时间。它通常用于性能测试中,衡量一组请求的整体性能(例如,登录、查询等一系列操作的总响应时间)。

常见配置项

  • 计时器选项:选择是计算所有请求的总时间,还是仅计算部分请求的时间。
  • 计算响应时间:选择是否包括子请求的响应时间。

用法示例

在一个交易流程中,你可以使用事务控制器来包含多个请求,如登录、查询和支付。事务控制器将会计算这些请求总的响应时间。

常见用途

  • 衡量一系列请求的总体响应时间。
  • 性能测试时,测量用户执行某项任务的整体性能。

前置处理器

在取样器(Sampler)执行之前执行,用于在请求发送之前进行一些操作或准备工作。前置处理器通常用于修改请求参数、设置动态数据、计算值,或者执行某些与请求发送相关的操作。

BeanShell PreProcessor

可以执行 Java 代码,动态修改 JMeter 变量,获取环境变量等。

JSR223 PreProcessor

使用任意支持的脚本语言(如 Groovy、JavaScript、Jython 等)来执行操作。通常比 BeanShell​ 性能更好。

JDBC PreProcessor

用于在发送请求之前通过 JDBC(Java 数据库连接)执行数据库操作。它通常用于在测试中提前准备或验证数据、从数据库中提取必要的信息并将其用于后续的请求。

常见配置项

  • Variable Name:JDBC连接池名,由配置元件中的 JDBC Connection Configuration 创建。
  • SQL Query:在 JDBC PreProcessor 中执行的 SQL 查询。这个查询可以是 SELECT​、Callable Statement​、UPDATE​ 等,取决于测试需求。
  • Variable names:用于存储查询结果的变量名。

后置处理器

在取样器(Sampler)执行完毕之后,处理响应数据或执行一些操作。它常用于提取响应数据、断言响应内容、或根据响应数据执行后续操作。后置处理器通常用于提取和处理从服务器返回的数据,将其用于后续请求,或对结果进行分析。

正则表达式提取器

用于从响应数据中提取信息。它通过正则表达式匹配响应数据并提取出匹配的部分,然后将其存储为 JMeter 变量。

常见配置项

  • 引用名称:用于存储到变量名。
  • 正则表达式:提取文本的正则表达式,如 JSESSIONID=(.*?)​。
  • 模板:表示捕获组(表达式中的括号)中的匹配内容,如 $1$​。
  • 匹配数字:控制提取第几个匹配项(提取的结果集,可能有多个),如 1​ 提取第一个匹配项。
  • 缺省值:如果匹配项为空,则使用该缺省值。

JSON 提取器

用于从 JSON 格式的响应数据中提取信息。它通过指定 JSON 路径来提取对应的字段值,存储为 JMeter 变量。

常见配置项

  • Names of create variables:用于存储到变量名。
  • JSON Path expressions:提取文本的JSON路径表达式,如 $.code​。
  • Match No. :控制提取第几个匹配项(提取的结果集,可能有多个),如 1​ 提取第二匹配项。
  • Default Values:如果匹配项为空,则使用该缺省值。

XPath 提取器

用于从 XML/HTML 响应中提取信息,支持通过 XPath 表达式匹配和提取数据。

常见配置项

  • 引用名称:用于存储到变量名。
  • Xpath query:提取文本的Xpath路径表达式,如 //*[@id="idName"]/div/div[1]​。
  • 匹配数字:控制提取第几个匹配项(提取的结果集,可能有多个),如 1​ 提取第二匹配项。
  • 缺省值:如果匹配项为空,则使用该缺省值。

CSS/JQuery提取器

用于从 XML/HTML 响应中提取信息,支持通过 CSS/JQuery选择器匹配和提取数据。

常见配置项

  • 引用名称:用于存储到变量名。
  • CSS选择器表达式:提取文本的CSS选择器表达式,如 #idName > div > div:nth-child(1)​。
  • 属性:指定要提取的属性值,如 class​。
  • 匹配数字:控制提取第几个匹配项(提取的结果集,可能有多个),如 1​ 提取第二匹配项。
  • 缺省值:如果匹配项为空,则使用该缺省值。

JDBC PostProcessor

用于在执行 JDBC 请求后处理数据库查询结果。它可以提取查询结果中的数据,并将这些数据存储到 JMeter 变量中,供后续请求或断言使用。

常见配置项

  • Variable Name:JDBC连接池名,由配置元件中的 JDBC Connection Configuration 创建。
  • SQL Query:在 JDBC PreProcessor 中执行的 SQL 查询。这个查询可以是 SELECT​、Callable Statement​、UPDATE​ 等,取决于测试需求。
  • Variable names:用于存储查询结果的变量名。

BeanShell PostProcessor

允许使用 BeanShell 脚本在响应处理后执行复杂的自定义操作。可以访问 JMeter 变量、响应数据,并执行 Java 代码。

JSR223 PostProcessor

允许使用更多脚本语言(如 Groovy、JavaScript、Jython 等),通常具有更好的性能。

断言

用于验证测试请求的返回结果是否符合预期的机制。通过断言,可以确保测试的稳定性和可靠性。如果断言失败,则表示当前请求没有达到预期结果,JMeter 会记录此错误。

响应断言

验证响应内容、响应时间、或 HTTP 状态码是否符合预期。

常见配置项

  • 响应字段:响应文本、响应代码、响应消息、响应头。
  • 模式匹配规则:包含、匹配、正则表达式、Equals 等。
  • 模式:定义需要验证的内容。

JSON 断言

验证 JSON 格式的响应数据,支持路径检查和值匹配。

常见配置项

  • Assert JSON Path exists:定义 JSON 路径,例如:$.data.id​。
  • Match as regular expression:是否使用正则表达式匹配。
  • Expected Value:指定预期值,支持正则表达式。

Xpath 断言

用于验证 XML/HTML 格式的响应,支持基于 XPath 表达式的内容提取和检查。

常见配置项

  • XPath 断言:断言文本的Xpath路径表达式。

BeanShell 断言

通过自定义脚本实现更复杂的验证逻辑。

常见配置项

  • 脚本文件:指定 Java 文件。

  • 脚本:使用 Java 编写自定义验证逻辑。

大小断言

验证响应数据的大小是否符合预期。

常见配置项

  • 响应字段:指定断言的内容,如完整响应、响应头、响应消息体、响应代码、响应信息。

  • Size to Assert:通过指定类型和字节大小来进行比较。

定时器

用于控制请求之间的间隔时间或等待时间。默认情况下,JMeter 中的所有请求会尽快执行,但在实际测试中,可能需要模拟用户行为,例如延迟请求或按一定的时间间隔发送请求,这时就需要用到定时器。

固定定时器

在每个请求之间添加固定的延迟时间。

常见配置项

  • 线程延迟:指定固定的等待时间。

高斯随机定时器

在每个请求之间添加随机延迟时间,基于正态分布(高斯分布)。

常见配置项

  • 偏差(毫秒) :延迟的随机波动范围。

  • 固定延迟偏移量(毫秒) :平均延迟时间。

均匀随机定时器

在每个请求之间添加随机延迟时间,基于均匀分布。

常见配置项

  • 最大随机延迟时间(毫秒) :随机延迟的上限。
  • 偏移量(毫秒) :最小延迟时间。

常数吞吐量定时器

控制每分钟发送的请求数量,保持固定吞吐量。

常见配置项

  • 目标吞吐量(请求/分钟) :设置期望的请求速率,例如 60 req/min​ 表示每秒 1 个请求。
  • 基于计算吞吐量:可选择影响的线程范围。

同步定时器

让多个线程在同一时间点同时发送请求,用于模拟并发场景。

常见配置项

  • 模拟用户组的数量:设置同时发送请求的线程数量。
  • 超时时间(毫秒) :设置最大等待时间,超过此时间线程将不再等待。

泊松随机定时器

在每个请求之间添加基于泊松分布的随机延迟时间。

总延迟时间 = $\text{Lambda} + \text{Constant Delay Offset}$

常见配置项

  • Lambda(毫秒) :泊松分布的平均值,用于控制请求之间的平均延迟时间。
  • Constant Delay Offset(毫秒) :设置最大等待时间,超过此时间线程将不再等待。

JSR223 定时器

允许用户使用脚本语言(如 Groovy、JavaScript、Beanshell 等)动态生成请求之间的延迟时间。

常见配置项

  • Parameters:传入的参数。
  • Script:执行脚本。

测试片段

用于在测试计划中复用脚本片段。它本身不会被直接执行,但可以通过其他元件(如模块控制器或 Include 控制器)调用,从而实现脚本的复用和管理。

配置元件

用于在测试计划中定义和管理全局设置、共享数据、参数化请求等。

用户定义的变量

用于定义 JMeter 测试中的全局变量或参数,可以在多个请求、控制器或元件之间共享这些变量。

常见配置项

  • 名称:变量名。
  • :变量的值。
  • 描述:变量的解释或说明。

CSV 数据文件配置

用于从 CSV 文件中读取数据,并将其传递给测试脚本中的变量。它在进行参数化测试时非常有用,可以模拟不同用户输入。

常见配置项

  • 文件名:指定CSV文件路径。
  • 文件编码:指定CSV文件的编码集。
  • 变量名称:指定每列数据接收的变量名。
  • 忽略首行:一般用于第一行是字段名的CSV,设置为True就会跳过第一行的数据。
  • 分隔符:指定CSV文件每列的分隔符,默认为,​。
  • 是否允许带引号:设置为True,CSV文件可以携带引号使用。

HTTP 请求默认值

用于为所有 HTTP 请求设置默认值,减少重复配置。通过该元件可以设置默认的协议、服务器名、端口号、路径等信息。

常见配置项

  • Web服务器:如协议、服务器名称/IP、端口号。
  • HTTP请求:如路径、内容编码。
  • 参数:如名称、值、编码、内容类型、包含等于。

HTTP 请求头管理器

用于设置和管理 HTTP 请求中的头信息。可以在测试中模拟特定的请求头,例如模拟浏览器行为、身份验证等。

常见配置项

  • 名称:指定HTTP请求头名称。
  • :指定该HTTP请求头名称的值。

用于管理 HTTP 请求中的 Cookies。它会在请求之间自动存储和发送 Cookies,模拟真实用户的会话。

常见配置项

  • 每次反复清除Cookies:每次线程迭代时清除所有已存储的 Cookies。
  • 通过线程组控制清除:根据线程组的迭代逻辑清除,通常在线程组的每次循环结束后清除 Cookies。
  • 存储在Cookie管理器中的Cookie:可以添加自定义Cookie。

JDBC 连接配置

用于配置数据库连接信息。它为所有 JDBC 请求提供统一的数据库连接池。

常见配置项

  • Variable Name Bound to Pool:设置JDBC连接池,如Variable Name for created pool​设置连接池名称、Max Number of Connections​设置最大连接数。
  • Database Connection Configuration:数据库连接配置,如Database URL​数据库连接地址、JDBC Drier class​指定数据库连接驱动、Username​、Password​使用的数据库用户名和密码。

HTTP 缓存管理器

它可以存储和管理 HTTP 响应的缓存内容,从而减少重复请求,提升测试的真实性和准确性。

常见配置项

  • Clear cache each iteration(每次迭代清除缓存):启用后,JMeter 会在每次线程迭代时清除缓存,模拟“新用户”或“无缓存”访问。
  • Use Cache-Control/Expires Header(使用 Cache-Control/Expires 头):启用后,HTTP 缓存管理器会根据服务器返回的缓存头决定是否缓存响应。
  • Maximum size of cache(缓存的最大大小):设置缓存中可以存储的最大条目数。如果缓存条目超过该大小,将会自动清理最早的条目。

监听器

用于收集测试数据并生成报告的组件。它可以实时显示和记录测试结果,以便分析性能、发现问题,并生成可视化的图表或日志文件。

查看结果树

  • 实时查看每个取样器的响应详情。
  • 显示请求和响应的完整数据(包括头部、正文等)。
  • 可用于调试脚本,检查请求是否正确、响应是否符合预期。

用表格查看结果

  • 将测试结果以表格形式显示,包含每次请求的响应时间、成功状态、线程名称等信息。
  • 适合快速浏览所有取样器的运行情况。

汇总报告

  • 提供测试结果的概要统计信息,包括吞吐量、平均响应时间、最大响应时间、最小响应时间、错误率等。
  • 适合快速分析性能测试结果。

聚合报告

  • 和汇总报告类似,但提供更多统计信息,如 90% 百分位响应时间、95% 百分位响应时间。
  • 适合深入分析性能瓶颈。

图形结果

  • 以折线图显示响应时间、吞吐量等数据的变化趋势。
  • 适合直观了解性能随时间的变化。

响应时间图

  • 以柱状图显示响应时间的分布情况,帮助识别性能稳定性。
  • 适合分析响应时间的波动范围。

PerfMon Metrics Collector

用于实时监控服务器的性能指标,例如 CPU 使用率内存使用率磁盘 I/O网络流量。它依赖服务器上的 PerfMon Server Agent 来采集数据。

需要添加Servers to Monitor的Host/IP、Port、Metric to collect来监控指定的硬件指标。

Transactions per Second

用于实时监控服务器的TPS,即每秒钟系统处理的事务数,是衡量系统吞吐量的重要指标。

Response Times Over Time

用于实时监控和显示测试过程中各取样器的响应时间随时间变化的趋势图。

Active Threads Over Time

用于实时显示测试过程中活跃线程数的变化趋势。

插件

JMeter也支持插件,可以前往JMeter-Plugins下载**plugins-manager.jar**,选项中安装需要的插件即可。

性能优化

  1. 增加堆内存与新生代内存

bin/jmeter.bat​中添加:r

rem 堆内存
set HEAP=-Xms512m -Xmx2g
rem 新生代内存
set NEW=-XX:NewSize=1g -XX:MaxNewSize=2g
  1. 非 GUI 模式

使用jmeter -n -t xxx.jmx -l xxx.jtl -e -o result​无界面启动。

  1. 适当调整线程数和Ramp-Up时间。
  2. 减少不必要断言。
  3. 减少不必要控制器。
  4. 减少不必要的监听器。
  5. 使用分布式测试。
  6. 使用更高效的结果存储方式。
  7. 增强硬件性能。

命令

命令行生成测试报告:jmeter -n -t 执行脚本路径 -l 执行结果的路径 -e -o 图形化报告的路径​。

分布式测试

JMeter 提供了分布式测试功能,允许你通过 调度机(Master)执行机(Slave) 来远程启动多个测试服务,分担负载并提高性能测试的规模。

  • 调度机(Master) :主控节点,负责启动测试并监控测试的执行。它负责协调多个执行机的工作,并收集测试结果。
  • 执行机(Slave) :从节点,负责实际执行测试负载。执行机接收来自调度机的命令,执行测试并返回结果。

Slave

  1. 确保所有执行机上安装 JMeter。
  2. 配置 JMeter 启动执行机模式,在执行机机器上,通过jmeter-server​命令行启动 JMeter 的 远程测试模式
  3. 开启防火墙,允许调度机通过指定端口(默认为 1099)访问。

Master

  1. 在调度机的 bin 目录下打开 jmeter.properties​ 配置文件。
  2. 配置 remote_hosts 参数,指定执行机的 IP 地址:
remote_hosts=192.168.1.101, 192.168.1.102  # 执行机的 IP 地址
  1. 指定.jmx文件,运行,远程启动指定IP或全部