本文大纲

《如何做性能测试》

JMeter的使用

测试工具介绍

JMeter介绍

JMeter 是一个由 Apache 开发的强大压力和性能测试工具,使用 Java 编写,并采用 Swing 构建图形用户界面 (GUI)。它提供了丰富的功能集,用于执行各种类型的负载测试:

  • HTTP 测试(支持录制) : 可以录制并回放 HTTP 请求,方便地进行 Web 应用的压力测试。
  • 数据库测试(JDBC) : 支持通过 JDBC 连接和测试数据库性能。
  • Java 程序测试 (JUnit) : 用于 Java 程序的自动化测试。

官方网站 :http://jmeter.apache.org/

参考文档:请查阅附件集中的《JMeter基本使用方法.pdf》。

JMeter 优点

  • 小巧 :JMeter 的安装包仅约 30MB,解压后即可使用。运行时需要 JDK 环境支持(与 LoadRunner 11 安装包的 4GB 相比,显得非常轻量)。
  • 易学 :相比其他复杂的性能测试工具如 LoadRunner,JMeter 功能较少且学习曲线较为平缓,适合初学者快速上手。
  • 够用 :可以录制和回放 HTTP 协议的请求,生成简单的报告以满足基本的使用需求。

JMeter 缺点

  • 性能一般 :在双核处理器的压力机上,最多只能模拟 75 到 100 个并发用户。此时,压力机的 CPU 使用率会达到 100%。
  • 内存消耗较大 :JMeter 运行时需要较多的系统内存,建议分配至少 512MB 至 1024MB 内存作为起步配置。
  • 界面体验不佳 :由于使用了 Swing 开发 GUI,界面设计较为老旧且不够美观,操作性一般。

改进方法

可以通过修改 jmeter.bat 或 jmeter.sh 文件来调整 JVM 的内存设置。

例如,在 Windows 系统中可以在命令行参数中加入以下内容:set HEAP=-Xms512m -Xmx1024m

在 Linux 或 macOS 系统中,则需要修改 jmeter.sh 文件中的相应配置。

调整完成后,可以使用 Java VisualVM 工具来监控和验证内存设置是否生效。这有助于确保 JMeter 在高负载测试时能更有效地运行。

JMeter的组件介绍

测试计划

测试计划是整个测试脚本的根节点,包含了所有的配置和逻辑结构。它定义了执行的所有任务。

线程组

线程组用于组织具体的测试任务。每个线程组中的“线程数”代表并发用户数量。例如,如果设置了 100 个线程,则表示有 100 个并发用户同时访问系统。

注意事项:

  • 根据压力机的 CPU 使用率调整线程数。一般双核 CPU 不建议超过 75 到 100 个并发用户。
  • Ramp-Up Period (预热时间): 指定所有线程在多长时间内启动完成,例如开启 2 个线程且 Ramp-Up Period 设置为 3 秒,则每个线程之间的间隔时间为 1.5 秒。
  • 循环次数 : 表示每个线程重复执行的次数,请不要与“循环控制器”混淆使用。

image2024-12-29_12-24-48.png

Sampler

Sampler(采样器)用于定义具体的请求类型,例如 HTTP 请求、JDBC 请求和 FTP 请求等。通过这些采样器可以发送各种类型的请求到被测试的应用程序或服务中。

断言

断言是用于验证 Sampler 返回结果是否符合预期的组件。它确保每个请求返回的数据满足特定条件,有助于确认应用程序行为正确性。

查看结果树

查看结果树用于显示每一次 Sampler 的执行结果。数据都放在内存了,不一会JMeter的内存就耗光了,JMeter会十分卡顿,所以在运行时请关闭查看结果树。

聚合报告

聚合报告总结了测试的总体性能指标。以下是各个字段的具体含义:

  1. Label : 定义的 HTTP 请求名称。
  2. Samples : 总共发送请求的数量。
  3. Average : 平均响应时间(毫秒)。
  4. Median : 中位数响应时间,即 50% 的响应时间线。
  5. 90% Line (90%) : 第 90 百分位的响应时间,表示 90% 的请求响应时间在此值之下。
  6. Min : 最小响应时间(毫秒)。
  7. Max : 最大响应时间(毫秒)。
  8. Error % : 错误率(错误样本占总样本的比例)。
  9. Throughput : 每秒钟完成请求数量(请求/秒)。
  10. KB/sec : 每秒从服务器接收的数据量(千字节/秒)。

image2024-12-29_12-26-7.png

使用 JMeter 进行 Oracle 数据库压测(JDBC)

在使用 JMeter 对 Oracle 数据库进行压力测试时,需要遵循一系列步骤来确保能够顺利配置和执行测试任务。

准备工作

  1. 添加 JDBC 驱动
    • 将 ojdbc14.jar 文件放入 JMeter 的 lib 目录中。例如,在 Apache JMeter 2.10 版本下,文件路径为 apache-jmeter-2.10\lib\。
    • 确保重启 JMeter 应用程序以加载新的 JDBC 驱动库。

创建测试计划

  1. 创建测试计划
    • 在 JMeter 中新建一个名为 jdbc.jmx 的测试计划文件。该文件将包含所有与 Oracle 数据库交互的配置和逻辑。
    • 通过右键点击“测试计划”节点,选择“添加 -> 测试计划 -> 线程组”,然后在新创建的线程组中进行后续配置。

配置 JDBC 参数

  1. 配置 JDBC 连接参数
    • 在线程组中添加一个 JDBC Connection Configuration 元素。通过右键点击线程组节点,选择“添加 -> 配置元件 -> JDBC Connection Configuration”。
    • 在弹出的对话框中填写必要的连接信息:
      • Variable Name : 指定用于存储数据库连接变量的名字(例如 jdbcConn)。
      • Database URL : Oracle 数据库的完整 URL,格式为 jdbc:oracle:thin:@<主机名>:<端口号>:<服务名>。
      • Driver Class : 选择合适的驱动类名称,对于 Oracle,通常使用 oracle.jdbc.driver.OracleDriver。
      • Username 和 Password : 输入数据库连接所需的用户名和密码。

准备执行测试

  1. 正式运行前的准备
    • 在实际压测过程中,为减少JMeter内存消耗并提高性能,请关闭“察看结果树”监听器。该组件会在后台记录每个请求的结果,并占用大量资源。
    • 通过右键点击相应的采样器(如 JDBC Request),选择“添加 -> 监听器”,然后去掉“察看结果树”的勾选即可。

示例配置说明

示例测试计划 jdbc.jmx 配置:

  1. 线程组设置

    • 设置合适的线程数和循环次数,例如:线程数设为 50,循环次数设为 10。
  2. JDBC Connection Configuration

    Variable Name: jdbcConn
    Database URL: jdbc:oracle:thin:@localhost:1521:orcl
    Driver Class: oracle.jdbc.driver.OracleDriver
    Username: sys as sysdba
    Password: Oracle123
  3. JDBC Request

    • 在线程组下添加 JDBC Request,配置 SQL 查询或命令。
    • 示例 SQL 语句:SELECT * FROM employees WHERE employee_id = ?
  4. 聚合报告监听器

    • 添加聚合报告监听器以收集和分析性能数据。

注意事项

  • 确保 ojdbc14.jar 或其他适用的 JDBC 驱动已正确加载。
  • 在进行实际压测前,建议先执行小规模的压力测试,确保所有配置均无误,并记录基准性能指标。
  • 关闭不必要的监听器(如“察看结果树”)以优化内存使用和提高性能。

通过以上步骤,您可以有效地利用 JMeter 对 Oracle 数据库进行压力测试,帮助评估系统的稳定性和响应能力。

image2024-12-29_12-26-58.pngimage2024-12-29_12-27-2.png

使用 JMeter 执行 JUnit 单元测试

在进行软件开发过程中,单元测试是确保代码质量的重要环节。JMeter 提供了执行JUnit单元测试的能力,可以帮助团队更好地管理和运行这些测试。

准备工作

  1. 编写并打包单元测试

    • 编写支持JUnit 3和JUnit 4的单元测试,并将它们打成一个jar包(例如 jmeter_junit_demo.jar)。
    • 确保单元测试类遵循相应的JUnit规范,以确保兼容性和可执行性。
  2. 添加JMeter依赖

    • 将生成的 jmeter_junit_demo.jar 包放入 JMeter 的 lib/junit/ 目录中。例如,在 Apache JMeter 2.10 版本下,文件路径为 apache-jmeter-2.10\lib\junit\。
    • 确保重启JMeter应用程序以加载新的依赖库。

创建测试计划

  1. 创建测试计划
    • 在 JMeter 中新建一个名为 junit.jmx 的测试计划文件。该文件将包含所有与JUnit单元测试相关的配置和逻辑。
    • 通过右键点击“测试计划”节点,选择“添加 -> 测试计划 -> 线程组”,然后在新创建的线程组中进行后续配置。

配置JMeter执行JUnit

  1. 正式运行前的准备
    • 在实际运行单元测试时,请关闭“察看结果树”监听器。该组件会记录每个请求的结果,占用大量内存并影响性能。
    • 可以通过右键点击相应的采样器(如JUnit Request),选择“添加 -> 监听器”,然后去掉“察看结果树”的勾选来实现。

示例配置说明

编写单元测试类

以下是一个简单的示例,展示了如何创建支持JUnit 3和JUnit 4的单元测试类:

image2024-12-29_12-27-59.png

创建测试计划 junit.jmx

  1. 线程组设置

    • 设置合适的线程数和循环次数,例如:线程数设为 1,循环次数设为 1。
  2. JUnit Request Config Element

    • 在线程组下添加 JUnit Request 配置元素,并指定单元测试的类名或方法名:

      Test Class: Junit.Dome
      Test Method (optional): add
  3. 聚合报告监听器

    • 添加聚合报告监听器以收集和分析性能数据。

image2024-12-29_12-28-6.png

此图展示了如何在JMeter中设置和运行JUnit测试的具体步骤。

注意事项

  • 确保 jmeter_junit_demo.jar 包中的单元测试类遵循相应的JUnit规范。
  • 在执行实际的压力测试之前,建议先进行小规模的测试以确保所有配置都正确无误,并记录基准性能指标。
  • 关闭不必要的监听器(如“察看结果树”)以优化内存使用和提高性能。

通过以上步骤,您可以有效地利用 JMeter 执行JUnit单元测试,帮助评估代码质量和执行效率。

总结

通过上述步骤,您可以轻松地将编写的单元测试集成到 JMeter 中进行执行,并利用其强大的性能分析工具来评估代码的质量。这不仅简化了开发过程中的测试环节,还提高了团队的工作效率。

如何在JMeter中录制复杂脚本

方案一:通过代理服务录制HTTP请求

背景介绍

JMeter可以作为代理服务器来拦截和记录浏览器与目标网站之间的HTTP通信。这使得开发人员能够轻松地创建用于压力测试的脚本。

jmeter可录制HTTP协议的两种方案  之一

步骤说明

  1. 启动JMeter的代理功能

    • 启动JMeter,并在“选项”菜单中选择“运行时设置”,然后点击“启用代理服务器”。这样就开启了JMeter作为HTTP代理的功能。
  2. 浏览器配置使用JMeter代理

    • 选定一个用于测试的浏览器,将其设置为使用本地主机上的JMeter代理服务器(默认端口通常是8080)。
  3. 在浏览器中执行登录和业务操作

    • 在已设置好代理服务的浏览器中访问目标网站并完成登录、浏览及其它所需的操作。这期间所有通过HTTP协议进行的数据交换都会被记录下来。
  4. JMeter自动录制脚本

    • JMeter会实时捕获用户在浏览器中的所有活动,并自动生成相应的测试脚本。
  5. 对生成的脚本进行参数化修改

    • 根据需求,手动调整或添加变量和动态内容以提高脚本的灵活性与可重用性。

示意图

image2024-12-29_12-29-54.png

此图为浏览器配置使用代理服务器。


方案二:使用Badboy工具

什么是Badboy?

Badboy是一款专门设计用于Web应用压力测试的记录器,能够简化从浏览器操作到JMeter脚本转换的过程。

Badboy是一个功能强大且用户友好的网页交互模拟和性能测试记录软件。它通过在用户的浏览器中安装扩展或使用内置浏览器来捕获HTTP请求,并自动为这些请求生成JavaScript代码片段。之后,可以将录制的脚本导出到多种格式,包括JMeter所需的格式。

如果直接在JMeter中通过代理记录脚本比较复杂,可以考虑使用专门的录制工具如Badboy。它能更方便地生成HTTP协议脚本,并导出为JMeter格式。

步骤说明

  1. 配置并启动Badboy

    • 访问Badboy官网下载安装软件。
  2. 在Badboy中记录用户操作

    • 启动Badboy后,开始录制用户与网站的交互过程。可以自由地模拟各种登录、浏览和业务操作等。
  3. 导出脚本至JMeter格式

    • 完成测试步骤后的关键一步是将生成的脚本文件从Badboy中导出为适合JMeter使用的格式。

示意图

image2024-12-29_12-43-38.pngimage2024-12-29_12-43-47.pngimage2024-12-29_12-43-51.png

此图为使用Badboy进行HTTP请求录制的过程示意。

这些图为Badboy录制过程中的操作界面和将记录的脚本文件导出为JMeter格式的具体步骤。

总结

通过上述两种方案,开发人员可以选择合适的方法在JMeter中录制复杂脚本。无论是直接使用JMeter作为代理服务器进行HTTP协议请求的捕获,还是借助Badboy这样的第三方工具生成并导出脚本到JMeter,都能够大大简化压力测试脚本的创建过程。

这不仅提高了工作效率,还使得后续的压力测试更加精准和高效。选择适合自己需求的方法来进行脚本录制,能够更好地服务于软件研发团队中的性能测试工作。

JMeter录制的案例

录制的一般流程

  1. 启动JMeter作为代理服务器

    • 在JMeter中配置并启用代理服务功能。这允许JMeter拦截和记录所有通过HTTP协议进行的浏览器通信。
  2. 设置浏览器使用JMeter代理

    • 配置选定的浏览器,使其连接到运行中的JMeter代理服务(本例使用端口为8080)。
  3. 执行登录及业务操作

    • 使用配置好的浏览器访问目标网站,并完成一系列登录和业务相关的操作。在此过程中,所有的HTTP请求都会被记录下来。
  4. 回放并验证脚本正确性

    • 在JMeter中运行录制的脚本来确认其能够准确地重现所有关键步骤。检查输出结果确保没有遗漏任何重要的细节或参数。
  5. 页面取值 – ticket

    • 从服务器响应中提取特定的信息,如登录成功的票据(ticket),并在后续请求中使用该信息。
  6. 参数化设置

    • 对于敏感的用户数据,例如用户名和密码,应采用变量替换技术确保脚本可以灵活处理不同的输入值。
  7. 压力点调整

    • 根据需要调整测试的压力点。例如,可以通过一次登录来模拟单一用户的活动模式;通过集合点(Synchronizing Timer)设置多个用户并发操作的场景;或者多次执行业务流程以验证系统的负载能力。
  8. 生成聚合报告

    • 执行压力测试后,使用JMeter内置的性能分析工具来生成汇总统计信息和详细日志。这有助于评估系统的响应时间、吞吐量和其他关键指标。

1、启动JMeter作为代理服务器

JMeter做为代理服务器,在本机的8080端口提供代理服务,再下一步供浏览器使用。

在JMeter中配置并启用代理服务功能。这允许JMeter拦截和记录所有通过HTTP协议进行的浏览器通信。

image2024-12-29_12-45-55.png

2、设置浏览器使用JMeter代理

配置选定的浏览器,使其连接到运行中的JMeter代理服务(本例使用端口为8080)。

浏览器配置使用代理。

image2024-12-29_12-46-30.png

3、录制-执行登录及业务操作

使用配置好的浏览器访问目标网站,并完成一系列登录和业务相关的操作。在此过程中,所有的HTTP请求都会被记录下来。

浏览器配置使用了代理,并在浏览器操作网页,就可以实现脚本的录制了。

4、回放并验证脚本正确性

回放脚本 ,看看脚本能不能正常运行。在JMeter中运行录制的脚本来确认其能够准确地重现所有关键步骤。检查输出结果确保没有遗漏任何重要的细节或参数。

在JMeter中添加:

  • 察看结果树
  • 聚合报告
  • HTTP cookei管理器

image2024-12-29_12-47-18.png

5、调整脚本 -从页面取值

从服务器响应中提取特定的信息,如登录成功的票据(ticket),并在后续请求中使用该信息。

经过上一步的回放,发现脚本不能正常运行。

因为:本系统的登录页面有一个小特点(仅限出本例中的系统 ),需要 进入登录页面后,要取页面中的LoginTicket,并在登录时,随着用户名、密码一起提交表单,服务端会验证。缺少LoginTicket会登录失败。

解决:JMeter要从页面取值,并在后续的请求中携带这个值。

页面取值 – ticket

image2024-12-29_12-48-32.png

进入登录页面后,要取页面中的LoginTicket,在登录时,随着用户名、密码一起提交表单\ \
$1$
1

image2024-12-29_12-48-40.png

6、参数化– 用户名、密码

对于敏感的用户数据,例如用户名和密码,应采用变量替换技术确保脚本可以灵活处理不同的输入值。

参数化

  • 用户名、密码保存在user.csv
  • 添加CSV Data Set Config
  • 线程组的线程数改为2个线程

image2024-12-29_12-54-0.png

user.csv内容如下图,每行一个 用户名与密码,用逗号分隔开。

image2024-12-29_12-54-30.png

请注意数据文件必须和测试计划文件(*.jmx)保存在同一目录下,JMeter 才可以正确读取数据。

image2024-12-29_12-54-45.png

7、压力点调整

根据需要调整测试的压力点。例如,可以通过一次登录来模拟单一用户的活动模式;通过集合点(Synchronizing Timer)设置多个用户并发操作的场景;或者多次执行业务流程以验证系统的负载能力。

目标:

  1. 2个用户每用户登录1次,一共登录2次。对应两个cookie。
  2. 然后在集合点等待,做仿真并发。
  3. 每1个用户100次执行业务操作,一共200次业务操作。

操作:

  1. 线程组:线程数改为2个线程,与csv文件中的用户数量相当。
  2. 添加:Synchronizing Timer(集合点),等待数量改为2,一定不要大于线程数,要刚刚相等。
  3. 添加:循环控制器,循环100次。
  4. 添加:察看结果树、聚合报告
  5. 添加:Http Cookie管理器,本例中2个用对应两个cookie。 对应服务端(Tomcat)中 2个Session。如果没有Http Cookie管理器,200次请求tomcat会创建200个Session,这不理想。
  6. 正式运行时关闭“察看结果树”,它对性能有影响。
  7. 运行测试脚本。

image2024-12-29_12-57-12.png

8、查看聚合报告

查看聚合报告,执行压力测试后,使用JMeter内置的性能分析工具来生成汇总统计信息和详细日志。这有助于评估系统的响应时间、吞吐量和其他关键指标。

image2024-12-29_12-58-26.png
表中各项的意义前面以有说明。