# Apache JMeter 工具的安装和使用指南

# 简介

Apache JMeter 是一款开源的软件测试工具,用于负载测试和性能测量。它被设计用来模拟大量用户对服务器、网络或对象进行请求,以测试其性能。本指南将详细介绍 Apache JMeter 的安装过程以及基本使用方式。

# 安装步骤

  1. # 系统要求

    • 操作系统:Windows, Linux, macOS
    • Java:JMeter 需要 Java 运行环境 (JRE)。建议使用 Java 8 或更高版本。

    # 下载 JMeter

    1. 访问 Apache JMeter 的官方网站 Apache JMeter
    2. 点击 "Download JMeter" 并选择最新版本下载。

    # 安装步骤

    1. 解压下载的压缩包到你选择的目录。
    2. 打开终端或命令提示符,导航到 JMeter 的 bin 目录。
    3. 运行 jmeter.bat (Windows)或 jmeter (Linux/Mac)启动 JMeter。

# JMeter 组件介绍

# 测试计划

测试计划是 JMeter 的核心,所有测试元素都包含在测试计划中。

  • 功能:用于配置整个性能测试的计划,包括线程组、控制器、监听器等。
  • 使用方式:在菜单栏中选择 Add -> Threads (Users) -> Thread Group 添加线程组。

# 线程组

线程组用于模拟一定数量的用户。

  • 功能:定义用户并发模拟的数量、循环次数、启动延迟等。
  • 使用方式:在测试计划中右键点击,选择 Add -> Samplers -> 选择请求类型,如 HTTP 请求。

参数说明:

  • 线程数:表示模拟的用户数。(如果要测试 1000 并发量那么就是修改这个参数)

  • Ramp-Up Period:启动所有线程所需的时间。

    例如,如果你设置 Ramp-Up Period 为 100 秒,并且你有 10 个线程,JMeter 将在这 100 秒内逐渐启动这些线程,而不是同时启动所有线程。

  • Loop Count:每个线程执行测试的次数。

# 取样器

取样器是实际发送请求的部分。是模拟用户请求的核心组件。

  • HTTP 请求:
    • 模拟对 Web 服务器的 HTTP 请求。
    • 可以配置 HTTP 方法(GET、POST、PUT 等)、资源路径、请求头、请求体等。
  • HTTPSample:
    • 这是 JMeter 早期版本中用于模拟 HTTP 请求的组件,现在通常使用 HTTP 请求取样器。
  • FTP 请求:
    • 模拟对 FTP 服务器的请求。
    • 可以执行文件上传、下载等操作。
  • JDBC 请求:
    • 用于执行数据库操作,如查询和更新。
    • 可以配置数据库连接、SQL 语句等。
  • JMS 点对点:
    • 模拟 JMS(Java 消息服务)的点对点消息发送和接收。
    • 可以配置消息目的地、消息选择器等。
  • JMS 发布订阅:
    • 模拟 JMS 发布订阅模型的消息交互。
    • 可以配置主题、消息内容等。
  • SMTP(简单邮件传输协议):
    • 模拟发送电子邮件的请求。
    • 可以配置邮件服务器、发件人、收件人、邮件内容等。
  • POP3(邮局协议版本 3):
    • 模拟接收电子邮件的请求。
    • 可以配置邮件服务器、用户名、密码等。
  • IMAP(互联网消息访问协议):
    • 模拟访问 IMAP 邮件服务器的请求。
    • 可以配置邮件服务器、用户名、密码等。
  • TCP 请求:
    • 模拟 TCP(传输控制协议)的请求。
    • 可以配置服务器、端口、发送和接收的数据等。
  • UDP 请求:
    • 模拟 UDP(用户数据报协议)的请求。
    • 可以配置服务器、端口、发送的数据等。
  • Java 请求:
    • 允许执行 Java 代码来生成请求。
    • 可以编写自定义的 Java 代码来模拟复杂的请求逻辑。
  • 自定义取样器:
    • 通过编写自定义代码,可以创建特定协议或应用的取样器。
  • BeanShell 取样器:
    • 允许使用 BeanShell 脚本语言来生成请求。
    • 可以编写自定义的 BeanShell 脚本来模拟请求。
  • JSR223 取样器:
    • 类似于 BeanShell 取样器,但使用 JSR223 脚本语言。
    • 支持多种脚本语言,如 Groovy 或 JavaScript。
  • OS Process Sampler:
    • 允许启动外部操作系统进程并捕获其输出。
    • 可以配置命令行、参数、工作目录等。
  • Test Action:
    • 虽然不是取样器,但可以控制测试的行为。
    • 可以设置在特定条件下执行的操作,如继续、停止等。
  • BSF 取样器:
    • 允许使用 BSF(Bean Scripting Framework)脚本语言来生成请求。
    • 可以编写自定义的脚本来模拟请求。

取样器是 JMeter 测试计划中不可或缺的部分,它们决定了测试将如何与服务器交互。通过选择合适的取样器,测试人员可以模拟各种类型的请求,从而全面测试应用程序的功能和性能。

# 逻辑控制器

用于控制测试计划中取样器(Samplers)的执行逻辑和顺序。它们可以组织和指导 JMeter 如何运行测试脚本。

  1. 单一控制器(Once Only Controller):
    • 只执行其子元素一次。
    • 适用于只需要运行一次的测试逻辑。
  2. 循环控制器(Loop Controller):
    • 按照指定的次数循环执行其子元素。
    • 可以设置循环次数,用于重复测试。
  3. 无限循环控制器(Forever Loop Controller):
    • 无限循环执行其子元素,直到手动停止或达到外部条件。
    • 适用于长时间运行的性能测试。
  4. 如果控制器(If Controller):
    • 根据条件判断来决定是否执行其子元素。
    • 可以设置条件表达式,根据变量值或逻辑表达式来控制执行。
  5. 除非控制器(Unless Controller):
    • 与 If Controller 相反,如果条件不成立,则执行子元素。
    • 用于在特定条件不满足时执行测试逻辑。
  6. 交互式控制器(Interleave Controller):
    • 交替执行其子元素中的取样器。
    • 用于并行执行多个测试路径。
  7. 随机顺序控制器(Random Order Controller):
    • 随机顺序执行其子元素中的取样器。
    • 用于模拟用户操作的不确定性。
  8. 运行时控制器(Runtime Controller):
    • 允许在测试运行时动态地添加或删除子元素。
    • 可以用于复杂的测试场景,需要动态调整测试逻辑。
  9. 吞吐量控制器(Throughput Controller):
    • 控制每秒处理的请求数,即吞吐量。
    • 可以设置目标吞吐量,并根据实际性能调整请求的发送速率。
  10. 模块控制器(Module Controller):
    • 允许将测试逻辑组织成模块。
    • 可以重用模块,简化测试计划的结构。
  11. 事务控制器(Transaction Controller):
    • 用于定义一个事务,包含一系列取样器。
    • 可以设置事务名称,并在监听器中单独查看事务的性能数据。
  12. 循环组控制器(Loop Count Controller):
    • 类似于 Loop Controller,但使用 JMeter 变量控制循环次数。
    • 提供了更多的灵活性来控制循环次数。
  13. 录制控制器(Recording Controller):
    • 用于控制录制过程中的逻辑。
    • 可以设置录制选项,如是否录制静态资源等。
  14. 分布式测试控制器(Distributed Test Controller):
    • 用于在分布式测试环境中控制测试逻辑。
    • 可以指定哪些节点执行特定的测试逻辑。
  15. 逻辑控制器开关(Logic Controller Switch):
    • 允许通过 JMeter 的属性来启用或禁用逻辑控制器及其子元素。
    • 可以方便地在测试计划中切换不同的测试逻辑。
  16. 复合控制器(Composite Controller):
    • 允许将多个逻辑控制器组合成一个复合控制器。
    • 可以简化复杂的测试计划结构。

逻辑控制器是 JMeter 测试计划中用于组织和控制测试流程的重要组件。通过使用不同的逻辑控制器,测试人员可以根据测试需求灵活地设计和执行测试脚本,从而更有效地模拟用户行为和测试应用程序的性能。

# 监听器

监听器用于展示性能测试结果,包括图表、报告、汇总信息等取样结果。它们帮助测试人员分析测试数据,识别性能瓶颈和问题。

  • 查看结果树(View Results Tree)
    • 显示请求和响应的详细信息。
    • 可以查看请求头、请求体、响应头、响应体、响应时间等。
  • 聚合报告(Summary Report)
    • 提供测试结果的汇总统计信息。
    • 显示总请求数、平均响应时间、最小 / 最大响应时间、吞吐量等关键指标。
  • 图形结果(Graph Results)
    • 以图形方式展示测试结果,如响应时间分布。
    • 可以生成各种图表,如直方图、曲线图等。
  • 请求历史记录(Request History)
    • 记录测试过程中的所有请求和响应。
    • 可以查看每个请求的详细信息和执行顺序。
  • 断言结果(Assertion Results)
    • 显示断言的执行结果。
    • 可以查看哪些断言通过,哪些失败,并提供失败断言的详细信息。
  • 监视器结果(Monitor Results)
    • 用于监视和收集测试过程中的各种数据。
    • 可以用于生成自定义的监视图表。
  • 吞吐量图(Throughput Graph)
    • 显示请求吞吐量随时间的变化。
    • 可以直观地看到系统处理请求的能力。
  • 响应时间图(Response Time Graph)
    • 显示响应时间随时间的变化。
    • 可以帮助识别性能瓶颈和系统负载的变化。
  • 响应时间百分比图(Response Time Percentiles Graph)
    • 显示响应时间的百分位数分布。
    • 可以设置不同的百分位数,如 50%、90%、95% 等。
  • 响应时间分布图(Response Time Distribution Graph)
    • 显示响应时间的分布情况。
    • 可以生成直方图,展示不同响应时间区间的请求数量。
  • 合成数据(Composite Graph)
    • 允许将多个指标组合在一个图表中展示。
    • 可以自定义图表,同时展示多个性能指标。
  • 合并结果(Merge Results)
    • 用于合并多个测试结果。
    • 可以比较不同测试的结果,或将多个测试的结果合并分析。
  • 时间标记(Timestamps)
    • 在结果中添加时间戳。
    • 可以提供请求和响应的精确时间信息。
  • MD5 Hash 断言(MD5 Hash Assertion)
    • 虽然不是监听器,但可以用于验证响应数据的完整性。
    • 可以检查响应数据的 MD5 哈希值是否符合预期。
  • SMIME 断言(SMIME Assertion)
    • 用于验证 S/MIME 加密的电子邮件消息。
    • 可以检查消息是否符合 S/MIME 标准。

监听器是 JMeter 中用于结果分析的重要组件。通过使用不同的监听器,测试人员可以从不同的角度和维度来分析测试结果,从而更全面地了解系统的性能表现。监听器还可以帮助识别问题和瓶颈,为性能优化提供依据。

# 定时器

定时器用于控制请求之间的间隔。这对于模拟真实用户操作和网络延迟非常有帮助。

  • 固定定时器(Constant Timer)
    • 在每个请求之间添加固定时间的延迟。
    • 适用于需要一致间隔的简单测试场景。
  • 统一随机定时器(Uniform Random Timer)
    • 在请求之间添加一个随机的时间延迟,延迟时间在指定的最小和最大值之间均匀分布。
    • 用于模拟用户操作的不确定性和网络延迟的随机性。
  • 高斯随机定时器(Gaussian Random Timer)
    • 根据高斯(正态)分布生成随机延迟时间。
    • 延迟时间围绕平均值分布,具有指定的均值和标准差。
  • 梯形随机定时器(Poisson Random Timer)
    • 根据泊松分布生成随机延迟时间。
    • 泊松分布用于模拟在固定时间间隔内发生事件的平均次数。
  • JSR223 定时器(JSR223 Timer)
    • 允许使用 JSR223 脚本语言(如 Groovy 或 JavaScript)来控制定时器的行为。
    • 可以根据复杂的逻辑来动态设置延迟时间。
  • BeanShell 定时器(BeanShell Timer)
    • 类似于 JSR223 定时器,但使用 BeanShell 脚本语言。
    • 允许在 BeanShell 脚本中编写自定义的延迟逻辑。
  • 通过率控制器(Throughput Controller)
    • 控制每秒处理的请求数,即吞吐量。
    • 可以设置目标吞吐量,并根据实际性能调整请求的发送速率。
  • 同步定时器(Synchronizing Timer)
    • 用于同步多个线程组的执行。
    • 所有线程都会在定时器处等待,直到达到指定的时间或事件。
  • 共享定时器(Shared Timer)
    • 允许多个线程组共享同一个定时器设置。
    • 适用于需要在多个线程组之间保持一致延迟的场景。
  • 响应时间百分比定时器(Response Time Percentiles Timer)
    • 根据响应时间的百分位数来控制请求的发送速率。
    • 可以设置目标百分位数,如 90% 或 95%,以保证大多数请求在该响应时间之内完成。
  • 预处理器(Pre-Processor)
    • 虽然不是定时器,但预处理器可以在请求发送前执行操作。
    • 有时可以与定时器结合使用,以实现特定的测试逻辑。
  • 后处理器(Post-Processor)
    • 同样不是定时器,但后处理器可以在请求发送后执行操作。
    • 可以用于处理请求结果,或根据结果调整后续请求的定时。

定时器是 JMeter 中非常重要的组件,它们允许测试人员模拟各种用户行为和网络条件。通过合理配置定时器,可以更准确地测试应用程序在不同负载和延迟下的性能表现。

# 断言

断言用于验证响应是否符合预期。断言可以检查响应数据的各个方面,如响应时间、响应代码、响应消息、响应内容等。

  • 响应断言(Response Assertion)
    • 用于检查响应数据是否符合特定的条件。
    • 可以设置响应字段(如响应代码、响应消息、响应数据等)和预期的值或模式。
  • 大小断言(Size Assertion)
    • 用于检查响应数据的大小是否在指定的范围内。
    • 可以设置最小和最大字节数。
  • 时长断言(Duration Assertion)
    • 用于检查请求的执行时间是否在指定的范围内。
    • 可以设置最小和最大时长。
  • 响应时间断言(Response Time Assertion)
    • 用于检查单个请求的响应时间是否在指定的范围内。
    • 可以设置最小和最大响应时间。
  • BeanShell 断言(BeanShell Assertion)
    • 允许使用 BeanShell 脚本语言编写自定义的断言逻辑。
    • 可以根据复杂的条件来验证响应数据。
  • JSR223 断言(JSR223 Assertion)
    • 类似于 BeanShell 断言,但使用 JSR223 脚本语言。
    • 支持多种脚本语言,如 Groovy 或 JavaScript。
  • 正则表达式断言(Regular Expression Assertion)
    • 使用正则表达式来验证响应数据。
    • 可以设置搜索模式,并检查响应数据是否与模式匹配。
  • JSON 断言(JSON Assertion)
    • 用于验证 JSON 格式的响应数据。
    • 可以设置 JSON 路径表达式和预期的值。
  • XML 断言(XML Assertion)
    • 用于验证 XML 格式的响应数据。
    • 可以设置 XPath 表达式和预期的值。
  • SMIME 断言(SMIME Assertion)
    • 用于验证 S/MIME 加密的电子邮件消息。
    • 可以检查消息是否符合 S/MIME 标准。
  • MD5 Hash 断言(MD5 Hash Assertion)
    • 用于验证响应数据的 MD5 哈希值。
    • 可以设置预期的 MD5 哈希值,并与实际响应数据的哈希值进行比较。
  • 断言结果(Assertion Results)
    • 虽然不是断言本身,但用于查看断言的执行结果。
    • 可以显示哪些断言成功,哪些失败。
  • HTML 断言(HTML Assertion)
    • 用于检查 HTML 响应内容是否符合预期。
    • 可以设置 HTML 元素和属性的预期值。
  • 图片断言(Image Assertion)
    • 用于检查图像响应是否符合预期。
    • 可以设置图像的预期尺寸或哈希值。
  • URL 重写断言(URL Re-writing Modifier)
    • 用于修改响应中的 URL,以适应特定的测试需求。
    • 可以设置重写的规则。

使用断言可以显著提高测试的自动化和准确性。通过设置断言,测试人员可以自动验证测试结果是否符合预期,从而减少手动检查的需要。断言还可以帮助识别性能问题、数据错误或其他潜在问题,从而提高软件质量。

# 配置元件

配置元件用于设置测试环境。它们不会直接发送请求,但可以对测试计划中的取样器(Samplers)产生影响。(可以在全局设置,也可以在具体的取样器前)

  • HTTP 请求默认值(HTTP Request Defaults)
    • 设置所有 HTTP 请求的默认属性,如协议、服务器或域名、端口号等。
    • 可以为所有 HTTP 请求提供一个统一的请求模板。
  • HTTP Cookie 管理器(HTTP Cookie Manager)
    • 管理 HTTP 请求中的 Cookie。
    • 可以自动处理服务器响应中的 Set-Cookie 头部,并在后续请求中发送 Cookie。
  • HTTP Header 管理器(HTTP Header Manager)
    • 允许用户自定义 HTTP 请求的头部信息。
    • 可以添加、修改或删除请求头部,如 User-Agent、Accept 等。
  • HTTP 授权管理器(HTTP Authorization Manager)
    • 设置 HTTP 请求的认证信息。
    • 可以配置用户名和密码,用于 HTTP 基础认证或摘要认证。
  • CSV 数据文件设置(CSV Data Set Config)
    • 用于从 CSV 文件中读取测试数据。
    • 可以设置文件路径、变量名称、分享模式等,用于参数化测试。
  • JNDI 配置(JNDI Configuration)
    • 用于配置 Java 命名和目录接口(JNDI)的属性。
    • 可以设置 JNDI 环境的初始上下文和属性,通常用于数据库连接。
  • 数据库连接配置(JDBC Connection Configuration)
    • 设置数据库连接的详细信息。
    • 可以配置数据库驱动、URL、用户名和密码等。
  • 用户定义的变量(User Defined Variables)
    • 允许用户定义自己的变量和值。
    • 这些变量可以在测试计划中的任何地方使用。
  • 常量(Constant Timer)
    • 虽然不是配置元件,但常量可以用于设置测试计划中的常量值。
  • 随机变量(Random Variable Config)
    • 生成一个随机数或随机选择一个值。
    • 可以设置最小值、最大值或可能的值列表。
  • CSV 读取器(CSV Reader)
    • 与 CSV Data Set Config 类似,但用于读取 CSV 文件中的所有数据。
    • 可以设置文件路径和变量名称。
  • JSR223 定时器(JSR223 Timer)
    • 允许使用脚本语言(如 Groovy 或 JavaScript)来控制定时器的行为。
    • 可以执行复杂的时间间隔计算。
  • 统一随机定时器(Uniform Random Timer)
    • 在请求之间添加随机延迟,模拟真实用户的行为。
    • 可以设置最小和最大延迟时间。
  • SMIME 属性(SMIME Config)
    • 用于配置 S/MIME 加密的属性。
    • 可以设置证书、私钥等信息。
  • DNS Cache Manager
    • 管理 DNS 缓存,可以用于测试 DNS 解析性能。
  • 系统属性(System Properties Config)
    • 设置系统属性。
    • 可以添加或修改 JVM 系统属性。
  • SMB 测试元素(SMB Test Element)
    • 用于测试 SMB 协议的性能。
  • FTP 配置(FTP Request Defaults)
    • 设置 FTP 请求的默认属性。
    • 可以配置 FTP 服务器的地址、端口、用户名和密码等。

这些配置元件可以根据测试的需求和场景进行选择和配置。通过合理使用这些配置元件,可以增强测试脚本的功能,提高测试的灵活性和准确性。它们允许测试人员在测试计划中设置环境参数、管理数据和控制测试流程。

# 前置处理器和后置处理器

# 前置处理器:

在取样器执行之前运行的脚本或代码。

  1. 正则表达式修改器(Regular Expression Modifier)
    • 允许用户使用正则表达式来修改取样器的请求数据。
    • 可以设置搜索模式和替换模式,对请求参数进行动态替换。
  2. 边界修改器(Boundary Modifier)
    • 类似于正则表达式修改器,但用于修改请求中的边界标记。
    • 可以设置开始和结束字符串,以及替换文本。
  3. JSON 修改器(JSON Modifier)
    • 用于修改 JSON 格式的请求数据。
    • 用户可以指定 JSON 路径表达式来定位和修改特定的值。
  4. XML 修改器(XML Modifier)
    • 用于修改 XML 格式的请求数据。
    • 用户可以指定 XPath 表达式来定位和修改所需的数据。
  5. CSS/JQuery 选择器修改器(CSS/JQuery Modifier)
    • 用于修改 HTML 请求中的 CSS 或 JQuery 选择器。
    • 允许用户通过选择器定位 HTML 元素,并修改其内容。
  6. 属性修改器(Property Modifier)
    • 用于设置或修改 JMeter 的属性。
    • 可以设置属性的名称和值,以及是否追加到现有属性。
  7. JSR223 前置处理器(JSR223 PreProcessor)
    • 允许用户编写自定义的脚本,以处理取样器的请求。
    • 支持多种脚本语言,如 Groovy、JavaScript 等。
  8. BeanShell 前置处理器(BeanShell PreProcessor)
    • 类似于 JSR223 前置处理器,但使用的是 BeanShell 脚本语言。
  9. 计数器(Counter)
    • 在每次迭代时递增计数器的值。
    • 可以设置初始值、增量和最大值。
  10. 配置元素(Config Elements)
    • 用于设置测试环境的配置,如 HTTP 请求默认值、数据库连接等。
    • 这些配置可以在前置处理器中被修改,以适应不同的测试场景。
  11. CSV 数据文件设置(CSV Data File Setup)
    • 用于从 CSV 文件中读取测试数据,并在每次迭代时更新请求参数。
    • 可以设置文件路径、变量名称和分享模式。
  12. JNDI 属性(JNDI Configuration)
    • 用于配置 Java 命名和目录接口(JNDI)的属性。
    • 可以设置 JNDI 环境的初始上下文和属性。
  13. JMeter 变量延迟器(JMeter Variable Delay)
    • 用于在请求之前添加随机延迟,模拟真实用户的行为。
    • 可以设置最小和最大延迟时间。
  14. SMIME 属性(SMIME Config)
    • 用于配置 S/MIME 加密的属性。
    • 可以设置证书、私钥等信息。
  15. HTTP URL 重写修饰符(HTTP URL Re-writing Modifier)
    • 用于重写 HTTP 请求的 URL,以适应特定的测试需求。
  16. HTTP 信息头部管理器(HTTP Information Header Manager)
    • 用于管理 HTTP 请求的头部信息。
    • 可以添加、修改或删除请求头部。
  17. 用户参数(User Parameters)
    • 用于设置用户特定的参数,如用户 ID 或会话信息。

通过合理使用这些前置处理器,可以增强测试脚本的功能,提高测试的灵活性和准确性。它们允许测试人员在请求发送之前对请求进行动态修改,以适应复杂的测试场景。

# 后置处理器:

在取样器执行之后运行的脚本或代码。

  1. 正则表达式提取器(Regular Expression Extractor)
    • 用于从响应数据中提取信息,并将其存储为变量,以便后续使用。
    • 用户可以定义一个正则表达式来匹配响应中的特定模式,并捕获组(capture groups)中的数据。
  2. 边界提取器(Boundary Extractor)
    • 类似于正则表达式提取器,但用于提取响应数据中的边界标记。
    • 可以设置开始和结束字符串,提取这两个标记之间的文本。
  3. JSON 提取器(JSON Extractor)
    • 用于从 JSON 格式的响应中提取数据。
    • 用户可以指定 JSON 路径表达式来提取特定的值。
  4. XML 提取器(XML Extractor)
    • 用于从 XML 格式的响应中提取数据。
    • 用户可以指定 XPath 表达式来定位和提取所需的数据。
  5. CSS/JQuery 选择器提取器(CSS/JQuery Extractor)
    • 用于从 HTML 响应中使用 CSS 或 JQuery 选择器提取数据。
    • 允许用户通过选择器定位 HTML 元素,并提取其内容。
  6. 属性提取器(Property Extractor)
    • 用于提取响应中的属性,并将其存储为 JMeter 属性。
    • 可以指定属性的名称和正则表达式。
  7. 断言结果(Assertion Results)
    • 用于检查断言是否通过,并根据断言结果执行后续操作。
    • 可以设置条件,如 “如果断言失败,则停止线程”。
  8. 调试取样器(Debug Sampler)
    • 用于调试测试脚本。
    • 执行后,可以在 JMeter 的日志文件中查看详细的调试信息。
  9. JSR223 后置处理器(JSR223 PostProcessor)
    • 允许用户编写自定义的脚本,以处理取样器的结果。
    • 支持多种脚本语言,如 Groovy、JavaScript 等。
  10. BeanShell 后置处理器(BeanShell PostProcessor)
    • 类似于 JSR223 后置处理器,但使用的是 BeanShell 脚本语言。(可以处理响应信息乱码的问题)
  11. JMeter 变量延迟器(JMeter Variable Delay)
    • 用于在请求之间添加随机延迟,模拟真实用户的行为。
    • 可以设置最小和最大延迟时间。
  12. 响应断言(Response Assertion)
    • 用于验证响应数据是否符合预期。
    • 可以设置响应文本、响应代码、响应时间等断言条件。
  13. 结果状态动作处理器(Result Status Action Handler)
    • 根据取样器的结果状态执行特定的动作。
    • 例如,如果响应状态码不是 200,则可以记录错误或发送通知。
  14. SMIME 断言(SMIME Assertion)
    • 用于验证 S/MIME 加密的电子邮件消息。
  15. MD5 Hash 断言(MD5 Hash Assertion)
    • 用于验证响应数据的 MD5 哈希值。

这些后置处理器可以根据测试的需求和场景进行选择和配置。通过合理使用这些后置处理器,可以增强测试脚本的功能,提高测试的自动化和准确性。

# 使用指南

# 创建测试计划

  1. 在 JMeter 左侧面板,右键点击 Test Plan,选择 Add -> Threads (Users) -> Thread Group 创建一个线程组。
  2. 在线程组下创建 Sampler,比如 HTTP Request,配置请求的服务器地址和路径。
  3. 添加 Listener,如 View Results Tree,用于查看请求的结果数据。

# 配置性能测试

  1. 配置线程组的属性,如并发用户数、循环次数等。
  2. 添加配置元件,如定时器(Timer)来模拟真实用户的行为。
  3. 配置断言(Assertion)来验证请求的返回结果。

# 执行性能测试

  1. 点击工具栏中的 Start 按钮开始执行性能测试。
  2. 监控结果:查看 Listener 输出、Visualizer 监控器和聚合报告来分析测试结果。

# 生成测试报告

  1. 在 Listener 上右键点击,选择 Generate Report Dashboard 生成测试报告。
  2. 打开报告目录下的 index.html 文件查看详细性能统计信息。

# 测试报告解读

一般只添加 察看结果树汇总报告

  1. 察看结果树:可以看到每个请求的请求信息和响应信息,是否请求成功等信息
  2. 汇总报告:请求接口的总体情况等,下面提供详细指标的说明。

# 汇总报告指标解释

  1. 样本数(#Samples)
    • 表示在测试中执行的请求总数。
  2. 平均值(Average)
    • 请求的平均响应时间,即所有请求响应时间的总和除以请求数。
  3. 中位数(Median)
    • 将所有请求的响应时间从小到大排序后,位于中间位置的数值。它是一个衡量中心趋势的稳健指标,不受极端值的影响。
  4. 90% 百分位(90% Line)
    • 90% 请求的响应时间都小于该值。这意味着有 10% 的请求响应时间比这个数值要长。
  5. 95% 百分位(95% Line)
    • 类似于 90% 百分位,但这里表示 95% 的请求响应时间都小于该值。
  6. 99% 百分位(99% Line)
    • 99% 的请求响应时间都小于该值,用于衡量极端情况下的响应时间。
  7. 最小值(Min)
    • 所有请求中响应时间的最小值。
  8. 最大值(Max)
    • 所有请求中响应时间的最大值。
  9. 错误 %(Error%)
    • 出现错误的请求占总请求的百分比。错误通常是指服务器返回了非 200 状态码,或者 JMeter 的断言失败。
  10. 吞吐量(Throughput)
    • 每秒处理的请求数。计算公式为: 样本数 / 测试总时间(秒)
  11. 接收 KB/sec(Received KB/sec)
    • 每秒从服务器接收到的数据量(以千字节为单位)。
  12. 发送 KB/sec(Sent KB/sec)
    • 每秒发送到服务器的数据量(以千字节为单位)。

# 性能指标的解读

  • 平均响应时间:是衡量服务器性能的一个重要指标,理想情况下,这个值应该尽可能低。
  • 百分位数:提供了对响应时间分布的更深入了解。例如,90% 百分位意味着有 10% 的请求响应时间可能更长,这有助于识别性能瓶颈。
  • 错误率:高错误率可能表明存在配置问题、服务器问题或网络问题。
  • 吞吐量:衡量系统处理请求的能力,高吞吐量通常意味着系统性能较好。
  • 数据传输速率:接收和发送的 KB/sec 指标可以提供网络带宽使用情况的洞察。

下面是一张汇总报告的图片:

# 具体案例

# 案例一:

现在有一个场景,需要测试某个项目的功能的并发情况,比如是项目 A, 需要测试 1000 个用户并发调用功能的情况,那么就需要先对这 1000 个用户登陆,才能调用接口,具体怎么写测试脚本?

问题解析:

  1. 怎么模拟一百个用户?
  2. 怎么模拟 cas 登陆?
  3. 怎么去 A 项目认证获取 A 项目有效的 sessionid?
  4. 怎么避免在 1000 个并发下,测试按照 cas 登陆 -> 获取 A 项目 sessionid-> 调用 A 项目接口 的顺序来执行?

解决:

  1. 可以通过将用户密码放到 cvs 文件中,循环读取到变量中,替换登陆用的变量。
  2. cas 登陆比较复杂,需要登陆两次。第一次登陆获取 cas 登陆界面的元素,第二次登陆需要带上第一次获取页面获取的元素和登陆用户名密码。可以模拟登陆过程,具体往下看。
  3. 登陆成功后可以去访问 A 项目,通过正则表达式提取器获取 A 项目认证成功的 sessionid,并保存到变量中。
  4. 可以使用循环控制器,它的作用是:按照指定的次数循环执行其子元素,那么我把这一个流程放到这个组件下就可以达到效果

实战:

  1. 新建一个测试计划,一下组件都是在这个测试计划下创建的

  2. 新建一个 配置元件-CSV 数据文件设置(CSV Data Set Config) 并配置 csv 文件,csv 文件保存用户的登陆信息(用户名、密码) 如图:

这样我们就可以在调用登陆接口的时候使用 username, password 变量了,会循环的读取

  1. 新建一个用户变量组件,保存全局请求的 host 主机地址、端口等,如图:

  2. 新建一个线程组,在添加一个临界控制器,临界控制器可以给一个锁表示,这里我们根据用户名称来锁边界,那么每个用户是并发的,在临界中调用接口是串行的,这样就达到目的了。

  3. 接着添加 cas 登陆校验的接口取样器,进行第一次 cas 登陆的处理

    下面是在 cas 登陆页面源代码中的元素内容:

  4. 进行第二次登陆的处理,真正的去登陆,并访问指定的项目后获取该项目的 sessionid

    经过上面的步骤就可以获取到 projectname 的 sessionid 了,在后续请求 projectname 项目的接口时可以在 cookie 管理中带上这个 jsessionid

  5. 请求业务接口

  6. 最后在添加一些汇总报表、汇总图之类的监听器来查看总体测试情况

# 问题

# 1、响应信息乱码问题如何处理?

解决:

添加 BeanShell PostProcessor 后置处理器,在 script(脚本输入框)填写:

prev.setDataEncoding("UTF-8");

# 2、如何进行 https 协议的请求测试?

解决:

在使用 JMeter 进行 HTTPS 测试时,由于 HTTPS 协议是在 HTTP 协议上增加了 SSL/TLS 层来保证数据传输的安全性,因此需要对 SSL 证书进行处理才能正确地进行测试。以下是一些基本步骤和考虑事项:

获取 HTTPS 证书

  • 可以通过浏览器访问 HTTPS 网站,然后通过浏览器的开发者工具或安全设置来导出证书。例如,在 Chrome 中,可以点击地址栏的锁形图标,选择 “证书”,然后导出证书

导入证书到 JMeter

  • 将导出的证书导入到 JMeter 的 SSL 管理器中。可以通过 JMeter 的 “选项” 菜单中的 “SSL 管理器” 进行操作

配置 JMeter 以信任证书

  • 有时需要将证书导入到 JMeter 的密钥库中,并在 JMeter 的配置文件中设置密钥库的路径和密码。例如,在 system.properties 文件中设置 javax.net.ssl.keyStorejavax.net.ssl.keyStorePassword

创建 HTTPS 请求

  • 在 JMeter 中创建一个 HTTP 请求,确保将协议设置为 HTTPS,并且端口设置为 443(HTTPS 的默认端口)

处理自签名证书

  • 如果服务器使用的是自签名证书,可能需要特别配置 JMeter 以信任这些证书,或者在测试环境中使用受信任的证书颁发机构颁发的证书

注意事项

  • 确保在测试过程中遵守所有相关的安全政策和最佳实践,不要在生产环境中进行未经授权的测试。
  • 测试完成后,应该清理测试环境,包括从 JMeter 中移除任何导入的证书。

# 总结

通过本指南,您学会了如何安装和使用 Apache JMeter 进行功能和性能测试。不断练习和探索 JMeter 的各项功能,将帮助您更好地进行性能测试和优化。

希望这篇文章对您有所帮助!