杰瑞科技汇

LoadRunner如何测试Java应用性能?

LoadRunner 测试 Java 应用主要有两种方式,针对不同的架构:

LoadRunner如何测试Java应用性能?-图1
(图片来源网络,侵删)
  1. 针对 Web 应用 (基于 HTTP/HTTPS):这是最常见的方式,无论后端是 Java (Spring Boot, Spring MVC, Jakarta EE) 还是其他技术,只要应用通过浏览器或 API 发送 HTTP 请求,就可以使用 LoadRunner 的 VuGen 录制脚本,并通过 协议分析 来进行测试,这是首选且最通用的方法。

  2. 针对 Java RMI 或 Socket 应用:如果应用使用了 Java 原生的远程方法调用 或 Socket 通信,不通过 HTTP,那么就需要使用 LoadRunner 的 Java Vuser (Java Vuser Protocol),这种方法相对复杂,使用较少。

下面我将重点介绍最主流的 Web 应用测试方法,并简要提及 Java Vuser。


第一部分:使用 HTTP/HTTPS 协议测试 Java Web 应用 (推荐)

这是性能测试的标准做法,LoadRunner 通过模拟成千上万的虚拟用户,向你的 Java 应用发送 HTTP 请求,从而测试服务器的性能、稳定性和资源利用率。

LoadRunner如何测试Java应用性能?-图2
(图片来源网络,侵删)

核心流程

整个测试流程可以概括为:计划脚本 -> 录制脚本 -> 参数化 -> 添加检查点 -> 关联 -> 运行场景 -> 分析结果

详细步骤

步骤 1:准备工作

  1. 安装 LoadRunner Professional:确保在你的 Windows 机器上安装了 LR。
  2. 确定被测环境
    • 目标服务器:你的 Java 应用部署在哪台服务器或服务器集群上?(Tomcat, WebLogic, JBoss/WildFly)
    • 测试环境:确保测试环境与生产环境配置(硬件、网络、软件版本)尽可能相似,以获得准确的结果。
  3. 获取测试账号:准备一个或多个用于测试的合法用户账号。
  4. 分析业务流程:明确你要测试的业务场景,用户登录 -> 浏览商品 -> 加入购物车 -> 下单支付,这个流程将是你录制脚本的基础。

步骤 2:使用 VuGen 创建和录制脚本

  1. 打开 VuGen:从 LoadRunner 程序组启动 Virtual User Generator。

  2. 创建新脚本

    • 选择 File -> New... 或点击工具栏的 "New" 按钮。
    • 在弹出的对话框中,选择 Web - HTTP/HTML 协议。
    • 给脚本命名(WebJavaShopTest),并选择脚本保存位置,点击 "Create"。
  3. 录制设置

    • VuGen 会弹出 "Recording Options" 对话框,这是最关键的一步。
    • Recording 标签页:
      • Applications to record: 选择 "Microsoft Internet Explorer" 或 "Mozilla Firefox",LR 会通过代理的方式录制浏览器的操作。
      • URLs to record: 你可以指定只录制特定域名下的请求,避免录制广告、图片等无关请求,保持脚本干净。
      • Advanced: 勾选 "Support for Data-Encrypted connections (HTTPS)",如果你的应用是 HTTPS 的。
    • Advanced 标签页:
      • Recording Level: 建议选择 "HTML-based script",它生成的脚本更清晰,易于理解和修改。
      • Proxy:确保代理端口设置正确(默认 8080)。
    • 点击 "OK"。
  4. 开始录制

    • VuGen 会自动打开你选择的浏览器。
    • 在浏览器中,手动操作你要测试的业务流程(登录、浏览、下单)。
    • 操作完成后,回到 VuGen,点击工具栏的红色停止按钮。

步骤 3:完善和增强脚本

录制完成后,你会在 VuGen 中看到一个包含 Action() 的脚本,它记录了你的每一步操作对应的 HTTP 请求。

  1. 参数化

    • 目的:避免所有虚拟用户都使用同一个固定的用户名和密码,这会导致服务器缓存失效或产生其他问题,参数化可以让每个虚拟用户使用不同的数据。
    • 操作
      • 在脚本视图中,找到登录请求中包含用户名和密码的行。
      • 选中用户名字符串,右键选择 Replace with a Parameter...
      • 选择参数类型(如 "File"),点击 "Define New Parameter..."。
      • 创建一个新的参数(如 username),关联到一个数据文件(CSV 或 DAT 文件),该文件中包含多个不同的用户名。
      • 对密码做同样操作。
    • 效果:运行时,LR 会从数据文件中逐行读取数据,分配给不同的 Vuser。
  2. 添加检查点

    • 目的:验证服务器返回的响应是否正确,确保脚本模拟的是有效的业务流程,而不是一个失败的请求。
    • 操作
      • 找到一个登录成功后服务器返回的关键信息,"欢迎您,{username}" 或一个特定的 "登录成功" 的文本。
      • 在对应的 web_reg_find 函数中(如果没有,可以手动添加)使用 SaveCount 或直接在 web_reg_save_param 中添加检查规则。
      • web_reg_find("Text=欢迎您", "SaveCount=welcome_count", LAST);,在后续的请求中,可以判断 welcome_count 是否大于0来判断登录是否成功。
  3. 关联

    • 目的:处理动态值,现代 Web 应用(Java Spring 等)广泛使用动态 Session ID、Token、CSRF Token 等,这些值每次请求都会变化,必须从服务器的响应中捕获,并在下一次请求中发送回去。
    • 操作
      • VuGen 的 Correlation Studio 可以自动帮助完成大部分工作。
      • 在脚本视图中,右键点击,选择 Show Correlation Results
      • 在弹出的窗口中,LR 会自动检测到可能需要关联的动态值(如 JSESSIONID),它会高亮显示这些值在请求和响应中的位置。
      • 选中需要关联的值,点击 "Correlate",LR 会自动生成 web_reg_save_param 函数来捕获这个值,并将其保存为一个参数(如 session_id)。
      • 你需要手动在后续需要该值的请求中,将硬编码的值替换为 {session_id} 参数。
  4. 事务

    • 目的:将一组相关的请求定义为一个“事务”,以便在分析报告中单独衡量其性能(如响应时间、吞吐量)。
    • 操作
      • lr_start_transaction("login_transaction"); 之前加上事务的开始标记。
      • 在登录相关的所有请求结束后,加上 lr_end_transaction("login_transaction", LR_AUTO);
      • 你可以为“浏览商品”、“加入购物车”、“下单”等关键业务流程都定义事务。

步骤 4:运行场景并监控

  1. 打开 Controller:从 LR 程序组启动 Controller。
  2. 创建场景
    • 将你在 VuGen 中创建的脚本拖拽到 "Scenario Groups" 窗格中。
    • 配置负载模式:
      • Ramp-Up: 虚拟用户在多长时间内逐渐增加到目标数量(10分钟内增加到500个用户)。
      • Duration: 持续运行的时间(运行30分钟)。
      • Pacing: 每个虚拟用户两次操作之间的间隔时间。
  3. 添加监控
    • 关键步骤! 点击工具栏的 "New Snapshot" 按钮,添加对 Java 应用服务器 的监控。
    • 选择 "Add Measurements"。
    • 在 "Available Counter Groups" 中,选择你要监控的目标:
      • Java Applications: 如果你安装了 LoadRunner Agent,可以直接监控到 JVM 的堆内存使用、GC 次数和耗时、线程数等。
      • Windows Resources / Linux Resources: 监控服务器的 CPU、内存、磁盘 I/O、网络 I/O。
      • Web Server (Apache, Nginx, Tomcat HTTP Connector): 监控 Web 服务器的性能指标。
    • 选择要监控的具体计数器,点击 "Add"。

步骤 5:分析结果

  1. 运行场景:在 Controller 中点击 "Start Scenario",开始测试。
  2. 实时监控:在 Controller 的 "Run" 视图中,你可以实时查看 Vuser 状态、图表、以及添加的监控数据。
  3. 生成报告:测试结束后,在 Controller 中点击 "Stop Scenario",然后点击 "Analyze Results"。
  4. 分析报告
    • 概要:查看关键指标,如每秒事务数、平均事务响应时间、错误率。
    • 事务响应时间图:分析不同负载下,核心业务流程的响应时间变化趋势。
    • Vuser图:查看负载是否按预期施加。
    • Web资源图:分析 HTTP 状态码(200, 404, 500等)的分布。
    • 监控数据图:将事务响应时间图与服务器资源(CPU、内存、JVM GC)图进行交叉分析,这是性能瓶颈定位的关键。
      • 如果响应时间急剧上升,而 CPU 使用率也同时达到 100%,则瓶颈很可能是 CPU。
      • 如果响应时间上升,但 CPU 和网络都很空闲,而 JVM 的 GC 频繁且耗时很长,则瓶颈很可能是内存(Full GC 导致 Stop-the-World)。

第二部分:使用 Java Vuser 协议测试 (针对 RMI/Socket)

如果你的应用不通过 HTTP,而是使用 Java RMI 或 Socket 进行通信,你需要使用 Java Vuser 协议。

核心思想

LR 的 Java Vuser 实际上是在 LR 运行时环境中嵌入了一个 JVM,你编写的 Vuser 脚本就是标准的 Java 代码,可以直接调用你应用的 Java 类和方法,这要求你的应用 JAR 包或依赖库必须在 LR 机器上可用。

步骤

  1. 在 VuGen 中创建 Java Vuser 脚本:选择 "Java - Java" 协议。

  2. 编写 Java 代码:VuGen 会提供一个空的 public int init()public int action()public int end() 方法。

    • 你需要手动编写 Java 代码来模拟业务逻辑,

      // action.java
      import com.yourcompany.YourService; // 导入你的应用服务类
      public class Actions {
          public int init() {
              // 初始化,例如加载配置、创建连接
              return 0;
          }
          public int action() {
              // 核心业务逻辑
              try {
                  YourService service = new YourService("rmi://yourserver/YourService");
                  String result = service.someMethod("param1");
                  lr.log_message("Received result: " + result);
              } catch (Exception e) {
                  lr.error_message("Error in action: " + e.getMessage());
                  return -1;
              }
              return 0;
          }
          public int end() {
              // 清理资源,例如关闭连接
              return 0;
          }
      }
  3. 添加依赖:你需要将你的应用 JAR 文件和所有依赖库(JAR)放到 LR 机器的 <LR_INSTALL_DIR>\classlib\java 目录下,或者通过 Build Path 添加到项目中。

  4. 编译和运行:LR 会自动编译你的 Java 代码,后续的运行、场景、监控和分析步骤与 HTTP 测试类似,但监控的重点会更多地放在 JVM 本身的性能上。


总结与最佳实践

特性 HTTP/HTTPS 协议 Java Vuser 协议
适用场景 Web 应用、REST API、微服务 Java RMI、Socket 通信、不经过 HTTP 的内部服务调用
优点 通用性强,与后端语言无关;录制脚本方便;功能强大,易于参数化、关联和检查点。 最真实,直接调用 Java 代码;可以测试非常底层的交互。
缺点 如果应用协议非常复杂或非标准,可能录制不到或需要大量手动修改。 复杂度高,需要手动编写所有代码;依赖管理麻烦;不通用,仅限 Java。
推荐度 ⭐⭐⭐⭐⭐ (首选) ⭐⭐ (仅在特定场景下使用)

最佳实践总结:

  1. 首选 HTTP/HTTPS 协议:99% 的 Java 应用性能测试都应使用此方法。
  2. 参数化是必须的:确保模拟真实用户行为,避免缓存和连接池带来的干扰。
  3. 关联是关键:务必处理好动态值,否则脚本会大面积失败。
  4. 检查点保证脚本质量:只有验证通过的脚本才有测试意义。
  5. 监控要全面:不要只看 LoadRunner 自带的指标,一定要监控服务器和 JVM 的资源。
  6. 场景设计要合理:模拟真实的用户行为模式(思考时间、操作频率),而不是简单地压榨服务器。
  7. 分析要深入:性能测试的最终目的是定位瓶颈,将业务性能指标与系统资源指标结合起来分析,才能找到问题的根源(是代码问题、数据库问题、还是配置问题?)。
分享:
扫描分享到社交APP
上一篇
下一篇