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

-
针对 Web 应用 (基于 HTTP/HTTPS):这是最常见的方式,无论后端是 Java (Spring Boot, Spring MVC, Jakarta EE) 还是其他技术,只要应用通过浏览器或 API 发送 HTTP 请求,就可以使用 LoadRunner 的 VuGen 录制脚本,并通过 协议分析 来进行测试,这是首选且最通用的方法。
-
针对 Java RMI 或 Socket 应用:如果应用使用了 Java 原生的远程方法调用 或 Socket 通信,不通过 HTTP,那么就需要使用 LoadRunner 的 Java Vuser (Java Vuser Protocol),这种方法相对复杂,使用较少。
下面我将重点介绍最主流的 Web 应用测试方法,并简要提及 Java Vuser。
第一部分:使用 HTTP/HTTPS 协议测试 Java Web 应用 (推荐)
这是性能测试的标准做法,LoadRunner 通过模拟成千上万的虚拟用户,向你的 Java 应用发送 HTTP 请求,从而测试服务器的性能、稳定性和资源利用率。

核心流程
整个测试流程可以概括为:计划脚本 -> 录制脚本 -> 参数化 -> 添加检查点 -> 关联 -> 运行场景 -> 分析结果。
详细步骤
步骤 1:准备工作
- 安装 LoadRunner Professional:确保在你的 Windows 机器上安装了 LR。
- 确定被测环境:
- 目标服务器:你的 Java 应用部署在哪台服务器或服务器集群上?(Tomcat, WebLogic, JBoss/WildFly)
- 测试环境:确保测试环境与生产环境配置(硬件、网络、软件版本)尽可能相似,以获得准确的结果。
- 获取测试账号:准备一个或多个用于测试的合法用户账号。
- 分析业务流程:明确你要测试的业务场景,用户登录 -> 浏览商品 -> 加入购物车 -> 下单支付,这个流程将是你录制脚本的基础。
步骤 2:使用 VuGen 创建和录制脚本
-
打开 VuGen:从 LoadRunner 程序组启动 Virtual User Generator。
-
创建新脚本:
- 选择 File -> New... 或点击工具栏的 "New" 按钮。
- 在弹出的对话框中,选择 Web - HTTP/HTML 协议。
- 给脚本命名(WebJavaShopTest),并选择脚本保存位置,点击 "Create"。
-
录制设置:
- 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"。
-
开始录制:
- VuGen 会自动打开你选择的浏览器。
- 在浏览器中,手动操作你要测试的业务流程(登录、浏览、下单)。
- 操作完成后,回到 VuGen,点击工具栏的红色停止按钮。
步骤 3:完善和增强脚本
录制完成后,你会在 VuGen 中看到一个包含 Action() 的脚本,它记录了你的每一步操作对应的 HTTP 请求。
-
参数化:
- 目的:避免所有虚拟用户都使用同一个固定的用户名和密码,这会导致服务器缓存失效或产生其他问题,参数化可以让每个虚拟用户使用不同的数据。
- 操作:
- 在脚本视图中,找到登录请求中包含用户名和密码的行。
- 选中用户名字符串,右键选择 Replace with a Parameter...。
- 选择参数类型(如 "File"),点击 "Define New Parameter..."。
- 创建一个新的参数(如
username),关联到一个数据文件(CSV 或 DAT 文件),该文件中包含多个不同的用户名。 - 对密码做同样操作。
- 效果:运行时,LR 会从数据文件中逐行读取数据,分配给不同的 Vuser。
-
添加检查点:
- 目的:验证服务器返回的响应是否正确,确保脚本模拟的是有效的业务流程,而不是一个失败的请求。
- 操作:
- 找到一个登录成功后服务器返回的关键信息,"欢迎您,{username}" 或一个特定的 "登录成功" 的文本。
- 在对应的
web_reg_find函数中(如果没有,可以手动添加)使用SaveCount或直接在web_reg_save_param中添加检查规则。 web_reg_find("Text=欢迎您", "SaveCount=welcome_count", LAST);,在后续的请求中,可以判断welcome_count是否大于0来判断登录是否成功。
-
关联:
- 目的:处理动态值,现代 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}参数。
-
事务:
- 目的:将一组相关的请求定义为一个“事务”,以便在分析报告中单独衡量其性能(如响应时间、吞吐量)。
- 操作:
- 在
lr_start_transaction("login_transaction");之前加上事务的开始标记。 - 在登录相关的所有请求结束后,加上
lr_end_transaction("login_transaction", LR_AUTO);。 - 你可以为“浏览商品”、“加入购物车”、“下单”等关键业务流程都定义事务。
- 在
步骤 4:运行场景并监控
- 打开 Controller:从 LR 程序组启动 Controller。
- 创建场景:
- 将你在 VuGen 中创建的脚本拖拽到 "Scenario Groups" 窗格中。
- 配置负载模式:
- Ramp-Up: 虚拟用户在多长时间内逐渐增加到目标数量(10分钟内增加到500个用户)。
- Duration: 持续运行的时间(运行30分钟)。
- Pacing: 每个虚拟用户两次操作之间的间隔时间。
- 添加监控:
- 关键步骤! 点击工具栏的 "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:分析结果
- 运行场景:在 Controller 中点击 "Start Scenario",开始测试。
- 实时监控:在 Controller 的 "Run" 视图中,你可以实时查看 Vuser 状态、图表、以及添加的监控数据。
- 生成报告:测试结束后,在 Controller 中点击 "Stop Scenario",然后点击 "Analyze Results"。
- 分析报告:
- 概要:查看关键指标,如每秒事务数、平均事务响应时间、错误率。
- 事务响应时间图:分析不同负载下,核心业务流程的响应时间变化趋势。
- 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 机器上可用。
步骤
-
在 VuGen 中创建 Java Vuser 脚本:选择 "Java - Java" 协议。
-
编写 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; } }
-
-
添加依赖:你需要将你的应用 JAR 文件和所有依赖库(JAR)放到 LR 机器的
<LR_INSTALL_DIR>\classlib\java目录下,或者通过Build Path添加到项目中。 -
编译和运行:LR 会自动编译你的 Java 代码,后续的运行、场景、监控和分析步骤与 HTTP 测试类似,但监控的重点会更多地放在 JVM 本身的性能上。
总结与最佳实践
| 特性 | HTTP/HTTPS 协议 | Java Vuser 协议 |
|---|---|---|
| 适用场景 | Web 应用、REST API、微服务 | Java RMI、Socket 通信、不经过 HTTP 的内部服务调用 |
| 优点 | 通用性强,与后端语言无关;录制脚本方便;功能强大,易于参数化、关联和检查点。 | 最真实,直接调用 Java 代码;可以测试非常底层的交互。 |
| 缺点 | 如果应用协议非常复杂或非标准,可能录制不到或需要大量手动修改。 | 复杂度高,需要手动编写所有代码;依赖管理麻烦;不通用,仅限 Java。 |
| 推荐度 | ⭐⭐⭐⭐⭐ (首选) | ⭐⭐ (仅在特定场景下使用) |
最佳实践总结:
- 首选 HTTP/HTTPS 协议:99% 的 Java 应用性能测试都应使用此方法。
- 参数化是必须的:确保模拟真实用户行为,避免缓存和连接池带来的干扰。
- 关联是关键:务必处理好动态值,否则脚本会大面积失败。
- 检查点保证脚本质量:只有验证通过的脚本才有测试意义。
- 监控要全面:不要只看 LoadRunner 自带的指标,一定要监控服务器和 JVM 的资源。
- 场景设计要合理:模拟真实的用户行为模式(思考时间、操作频率),而不是简单地压榨服务器。
- 分析要深入:性能测试的最终目的是定位瓶颈,将业务性能指标与系统资源指标结合起来分析,才能找到问题的根源(是代码问题、数据库问题、还是配置问题?)。
