# Apache JMeter 工具的安装和使用指南
# 简介
Apache JMeter 是一款开源的软件测试工具,用于负载测试和性能测量。它被设计用来模拟大量用户对服务器、网络或对象进行请求,以测试其性能。本指南将详细介绍 Apache JMeter 的安装过程以及基本使用方式。
# 安装步骤
# 系统要求
- 操作系统:Windows, Linux, macOS
- Java:JMeter 需要 Java 运行环境 (JRE)。建议使用 Java 8 或更高版本。
# 下载 JMeter
- 访问 Apache JMeter 的官方网站 Apache JMeter。
- 点击 "Download JMeter" 并选择最新版本下载。
# 安装步骤
- 解压下载的压缩包到你选择的目录。
- 打开终端或命令提示符,导航到 JMeter 的 bin 目录。
- 运行
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 如何运行测试脚本。
- 单一控制器(Once Only Controller):
- 只执行其子元素一次。
- 适用于只需要运行一次的测试逻辑。
- 循环控制器(Loop Controller):
- 按照指定的次数循环执行其子元素。
- 可以设置循环次数,用于重复测试。
- 无限循环控制器(Forever Loop Controller):
- 无限循环执行其子元素,直到手动停止或达到外部条件。
- 适用于长时间运行的性能测试。
- 如果控制器(If Controller):
- 根据条件判断来决定是否执行其子元素。
- 可以设置条件表达式,根据变量值或逻辑表达式来控制执行。
- 除非控制器(Unless Controller):
- 与 If Controller 相反,如果条件不成立,则执行子元素。
- 用于在特定条件不满足时执行测试逻辑。
- 交互式控制器(Interleave Controller):
- 交替执行其子元素中的取样器。
- 用于并行执行多个测试路径。
- 随机顺序控制器(Random Order Controller):
- 随机顺序执行其子元素中的取样器。
- 用于模拟用户操作的不确定性。
- 运行时控制器(Runtime Controller):
- 允许在测试运行时动态地添加或删除子元素。
- 可以用于复杂的测试场景,需要动态调整测试逻辑。
- 吞吐量控制器(Throughput Controller):
- 控制每秒处理的请求数,即吞吐量。
- 可以设置目标吞吐量,并根据实际性能调整请求的发送速率。
- 模块控制器(Module Controller):
- 允许将测试逻辑组织成模块。
- 可以重用模块,简化测试计划的结构。
- 事务控制器(Transaction Controller):
- 用于定义一个事务,包含一系列取样器。
- 可以设置事务名称,并在监听器中单独查看事务的性能数据。
- 循环组控制器(Loop Count Controller):
- 类似于 Loop Controller,但使用 JMeter 变量控制循环次数。
- 提供了更多的灵活性来控制循环次数。
- 录制控制器(Recording Controller):
- 用于控制录制过程中的逻辑。
- 可以设置录制选项,如是否录制静态资源等。
- 分布式测试控制器(Distributed Test Controller):
- 用于在分布式测试环境中控制测试逻辑。
- 可以指定哪些节点执行特定的测试逻辑。
- 逻辑控制器开关(Logic Controller Switch):
- 允许通过 JMeter 的属性来启用或禁用逻辑控制器及其子元素。
- 可以方便地在测试计划中切换不同的测试逻辑。
- 复合控制器(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 服务器的地址、端口、用户名和密码等。
这些配置元件可以根据测试的需求和场景进行选择和配置。通过合理使用这些配置元件,可以增强测试脚本的功能,提高测试的灵活性和准确性。它们允许测试人员在测试计划中设置环境参数、管理数据和控制测试流程。
# 前置处理器和后置处理器
# 前置处理器:
在取样器执行之前运行的脚本或代码。
- 正则表达式修改器(Regular Expression Modifier):
- 允许用户使用正则表达式来修改取样器的请求数据。
- 可以设置搜索模式和替换模式,对请求参数进行动态替换。
- 边界修改器(Boundary Modifier):
- 类似于正则表达式修改器,但用于修改请求中的边界标记。
- 可以设置开始和结束字符串,以及替换文本。
- JSON 修改器(JSON Modifier):
- 用于修改 JSON 格式的请求数据。
- 用户可以指定 JSON 路径表达式来定位和修改特定的值。
- XML 修改器(XML Modifier):
- 用于修改 XML 格式的请求数据。
- 用户可以指定 XPath 表达式来定位和修改所需的数据。
- CSS/JQuery 选择器修改器(CSS/JQuery Modifier):
- 用于修改 HTML 请求中的 CSS 或 JQuery 选择器。
- 允许用户通过选择器定位 HTML 元素,并修改其内容。
- 属性修改器(Property Modifier):
- 用于设置或修改 JMeter 的属性。
- 可以设置属性的名称和值,以及是否追加到现有属性。
- JSR223 前置处理器(JSR223 PreProcessor):
- 允许用户编写自定义的脚本,以处理取样器的请求。
- 支持多种脚本语言,如 Groovy、JavaScript 等。
- BeanShell 前置处理器(BeanShell PreProcessor):
- 类似于 JSR223 前置处理器,但使用的是 BeanShell 脚本语言。
- 计数器(Counter):
- 在每次迭代时递增计数器的值。
- 可以设置初始值、增量和最大值。
- 配置元素(Config Elements):
- 用于设置测试环境的配置,如 HTTP 请求默认值、数据库连接等。
- 这些配置可以在前置处理器中被修改,以适应不同的测试场景。
- CSV 数据文件设置(CSV Data File Setup):
- 用于从 CSV 文件中读取测试数据,并在每次迭代时更新请求参数。
- 可以设置文件路径、变量名称和分享模式。
- JNDI 属性(JNDI Configuration):
- 用于配置 Java 命名和目录接口(JNDI)的属性。
- 可以设置 JNDI 环境的初始上下文和属性。
- JMeter 变量延迟器(JMeter Variable Delay):
- 用于在请求之前添加随机延迟,模拟真实用户的行为。
- 可以设置最小和最大延迟时间。
- SMIME 属性(SMIME Config):
- 用于配置 S/MIME 加密的属性。
- 可以设置证书、私钥等信息。
- HTTP URL 重写修饰符(HTTP URL Re-writing Modifier):
- 用于重写 HTTP 请求的 URL,以适应特定的测试需求。
- HTTP 信息头部管理器(HTTP Information Header Manager):
- 用于管理 HTTP 请求的头部信息。
- 可以添加、修改或删除请求头部。
- 用户参数(User Parameters):
- 用于设置用户特定的参数,如用户 ID 或会话信息。
通过合理使用这些前置处理器,可以增强测试脚本的功能,提高测试的灵活性和准确性。它们允许测试人员在请求发送之前对请求进行动态修改,以适应复杂的测试场景。
# 后置处理器:
在取样器执行之后运行的脚本或代码。
- 正则表达式提取器(Regular Expression Extractor):
- 用于从响应数据中提取信息,并将其存储为变量,以便后续使用。
- 用户可以定义一个正则表达式来匹配响应中的特定模式,并捕获组(capture groups)中的数据。
- 边界提取器(Boundary Extractor):
- 类似于正则表达式提取器,但用于提取响应数据中的边界标记。
- 可以设置开始和结束字符串,提取这两个标记之间的文本。
- JSON 提取器(JSON Extractor):
- 用于从 JSON 格式的响应中提取数据。
- 用户可以指定 JSON 路径表达式来提取特定的值。
- XML 提取器(XML Extractor):
- 用于从 XML 格式的响应中提取数据。
- 用户可以指定 XPath 表达式来定位和提取所需的数据。
- CSS/JQuery 选择器提取器(CSS/JQuery Extractor):
- 用于从 HTML 响应中使用 CSS 或 JQuery 选择器提取数据。
- 允许用户通过选择器定位 HTML 元素,并提取其内容。
- 属性提取器(Property Extractor):
- 用于提取响应中的属性,并将其存储为 JMeter 属性。
- 可以指定属性的名称和正则表达式。
- 断言结果(Assertion Results):
- 用于检查断言是否通过,并根据断言结果执行后续操作。
- 可以设置条件,如 “如果断言失败,则停止线程”。
- 调试取样器(Debug Sampler):
- 用于调试测试脚本。
- 执行后,可以在 JMeter 的日志文件中查看详细的调试信息。
- JSR223 后置处理器(JSR223 PostProcessor):
- 允许用户编写自定义的脚本,以处理取样器的结果。
- 支持多种脚本语言,如 Groovy、JavaScript 等。
- BeanShell 后置处理器(BeanShell PostProcessor):
- 类似于 JSR223 后置处理器,但使用的是 BeanShell 脚本语言。(可以处理响应信息乱码的问题)
- JMeter 变量延迟器(JMeter Variable Delay):
- 用于在请求之间添加随机延迟,模拟真实用户的行为。
- 可以设置最小和最大延迟时间。
- 响应断言(Response Assertion):
- 用于验证响应数据是否符合预期。
- 可以设置响应文本、响应代码、响应时间等断言条件。
- 结果状态动作处理器(Result Status Action Handler):
- 根据取样器的结果状态执行特定的动作。
- 例如,如果响应状态码不是 200,则可以记录错误或发送通知。
- SMIME 断言(SMIME Assertion):
- 用于验证 S/MIME 加密的电子邮件消息。
- MD5 Hash 断言(MD5 Hash Assertion):
- 用于验证响应数据的 MD5 哈希值。
这些后置处理器可以根据测试的需求和场景进行选择和配置。通过合理使用这些后置处理器,可以增强测试脚本的功能,提高测试的自动化和准确性。
# 使用指南
# 创建测试计划
- 在 JMeter 左侧面板,右键点击 Test Plan,选择 Add -> Threads (Users) -> Thread Group 创建一个线程组。
- 在线程组下创建 Sampler,比如 HTTP Request,配置请求的服务器地址和路径。
- 添加 Listener,如 View Results Tree,用于查看请求的结果数据。
# 配置性能测试
- 配置线程组的属性,如并发用户数、循环次数等。
- 添加配置元件,如定时器(Timer)来模拟真实用户的行为。
- 配置断言(Assertion)来验证请求的返回结果。
# 执行性能测试
- 点击工具栏中的 Start 按钮开始执行性能测试。
- 监控结果:查看 Listener 输出、Visualizer 监控器和聚合报告来分析测试结果。
# 生成测试报告
- 在 Listener 上右键点击,选择 Generate Report Dashboard 生成测试报告。
- 打开报告目录下的 index.html 文件查看详细性能统计信息。
# 测试报告解读
一般只添加 察看结果树
和 汇总报告
- 察看结果树:可以看到每个请求的请求信息和响应信息,是否请求成功等信息
- 汇总报告:请求接口的总体情况等,下面提供详细指标的说明。
# 汇总报告指标解释
- 样本数(#Samples):
- 表示在测试中执行的请求总数。
- 平均值(Average):
- 请求的平均响应时间,即所有请求响应时间的总和除以请求数。
- 中位数(Median):
- 将所有请求的响应时间从小到大排序后,位于中间位置的数值。它是一个衡量中心趋势的稳健指标,不受极端值的影响。
- 90% 百分位(90% Line):
- 90% 请求的响应时间都小于该值。这意味着有 10% 的请求响应时间比这个数值要长。
- 95% 百分位(95% Line):
- 类似于 90% 百分位,但这里表示 95% 的请求响应时间都小于该值。
- 99% 百分位(99% Line):
- 99% 的请求响应时间都小于该值,用于衡量极端情况下的响应时间。
- 最小值(Min):
- 所有请求中响应时间的最小值。
- 最大值(Max):
- 所有请求中响应时间的最大值。
- 错误 %(Error%):
- 出现错误的请求占总请求的百分比。错误通常是指服务器返回了非 200 状态码,或者 JMeter 的断言失败。
- 吞吐量(Throughput):
- 每秒处理的请求数。计算公式为:
样本数 / 测试总时间(秒)
。
- 每秒处理的请求数。计算公式为:
- 接收 KB/sec(Received KB/sec):
- 每秒从服务器接收到的数据量(以千字节为单位)。
- 发送 KB/sec(Sent KB/sec):
- 每秒发送到服务器的数据量(以千字节为单位)。
# 性能指标的解读
- 平均响应时间:是衡量服务器性能的一个重要指标,理想情况下,这个值应该尽可能低。
- 百分位数:提供了对响应时间分布的更深入了解。例如,90% 百分位意味着有 10% 的请求响应时间可能更长,这有助于识别性能瓶颈。
- 错误率:高错误率可能表明存在配置问题、服务器问题或网络问题。
- 吞吐量:衡量系统处理请求的能力,高吞吐量通常意味着系统性能较好。
- 数据传输速率:接收和发送的 KB/sec 指标可以提供网络带宽使用情况的洞察。
下面是一张汇总报告的图片:
# 具体案例
# 案例一:
现在有一个场景,需要测试某个项目的功能的并发情况,比如是项目 A, 需要测试 1000 个用户并发调用功能的情况,那么就需要先对这 1000 个用户登陆,才能调用接口,具体怎么写测试脚本?
问题解析:
- 怎么模拟一百个用户?
- 怎么模拟 cas 登陆?
- 怎么去 A 项目认证获取 A 项目有效的 sessionid?
- 怎么避免在 1000 个并发下,测试按照 cas 登陆 -> 获取 A 项目 sessionid-> 调用 A 项目接口 的顺序来执行?
解决:
- 可以通过将用户密码放到 cvs 文件中,循环读取到变量中,替换登陆用的变量。
- cas 登陆比较复杂,需要登陆两次。第一次登陆获取 cas 登陆界面的元素,第二次登陆需要带上第一次获取页面获取的元素和登陆用户名密码。可以模拟登陆过程,具体往下看。
- 登陆成功后可以去访问 A 项目,通过正则表达式提取器获取 A 项目认证成功的 sessionid,并保存到变量中。
- 可以使用循环控制器,它的作用是:按照指定的次数循环执行其子元素,那么我把这一个流程放到这个组件下就可以达到效果
实战:
新建一个测试计划,一下组件都是在这个测试计划下创建的
新建一个
配置元件-CSV 数据文件设置(CSV Data Set Config)
并配置 csv 文件,csv 文件保存用户的登陆信息(用户名、密码) 如图:
这样我们就可以在调用登陆接口的时候使用 username, password 变量了,会循环的读取
新建一个用户变量组件,保存全局请求的 host 主机地址、端口等,如图:
新建一个线程组,在添加一个临界控制器,临界控制器可以给一个锁表示,这里我们根据用户名称来锁边界,那么每个用户是并发的,在临界中调用接口是串行的,这样就达到目的了。
接着添加 cas 登陆校验的接口取样器,进行第一次 cas 登陆的处理
下面是在 cas 登陆页面源代码中的元素内容:
进行第二次登陆的处理,真正的去登陆,并访问指定的项目后获取该项目的 sessionid
经过上面的步骤就可以获取到 projectname 的 sessionid 了,在后续请求 projectname 项目的接口时可以在 cookie 管理中带上这个 jsessionid
请求业务接口
最后在添加一些汇总报表、汇总图之类的监听器来查看总体测试情况
# 问题
# 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.keyStore
和javax.net.ssl.keyStorePassword
创建 HTTPS 请求:
- 在 JMeter 中创建一个 HTTP 请求,确保将协议设置为 HTTPS,并且端口设置为 443(HTTPS 的默认端口)
处理自签名证书:
- 如果服务器使用的是自签名证书,可能需要特别配置 JMeter 以信任这些证书,或者在测试环境中使用受信任的证书颁发机构颁发的证书
注意事项:
- 确保在测试过程中遵守所有相关的安全政策和最佳实践,不要在生产环境中进行未经授权的测试。
- 测试完成后,应该清理测试环境,包括从 JMeter 中移除任何导入的证书。
# 总结
通过本指南,您学会了如何安装和使用 Apache JMeter 进行功能和性能测试。不断练习和探索 JMeter 的各项功能,将帮助您更好地进行性能测试和优化。
希望这篇文章对您有所帮助!