4. JMeter 脚本录制与回放:使用 Badboy 或 JMeter HTTP(S) 测试脚本录制器录制脚本,并回放验证
在性能测试的早期阶段,脚本录制是快速生成测试用例的有效手段。JMeter 生态提供了两种主流的录制方案:Badboy(独立工具)和 JMeter HTTP(S) 测试脚本录制器(内置组件)。本章将对比这两种录制方式的操作流程、适用场景及回放验证方法,帮助你在双引擎巡检脚本编排中快速获取初始脚本。
4.1 录制方案对比
| 对比维度 | Badboy + JMeter | JMeter HTTP(S) 测试脚本录制器 |
|---|---|---|
| 工具类型 | 独立桌面应用,录制后导出为 JMeter 脚本 | JMeter 内置代理组件,直接生成脚本 |
| 录制方式 | 内嵌浏览器,自动捕获 HTTP 请求 | 系统代理模式,需手动配置浏览器代理 |
| 脚本导出 | 导出为 .jmx 文件,支持参数化预处理 | 录制过程中实时生成采样器,录制后保存为 .jmx |
| 适用场景 | 快速录制复杂 Web 应用,适合非技术人员 | 轻量级录制,适合已有 JMeter 环境的团队 |
| 脚本质量 | 需手动清理冗余请求(如静态资源) | 需手动过滤非必要请求,支持正则过滤 |
4.2 使用 Badboy 录制脚本
Badboy 是一款基于 IE 内核的 Web 应用测试工具,录制后可直接导出为 JMeter 脚本。以下是标准操作流程:
- 启动 Badboy:打开 Badboy 应用,默认进入录制模式(红色录制按钮高亮)。
- 输入目标 URL:在地址栏输入被测应用的入口地址,点击“Go”开始录制。
- 执行业务操作:在 Badboy 内嵌浏览器中完成登录、查询、提交等业务流程。
- 停止录制:点击红色录制按钮停止捕获。
- 清理脚本:删除不必要的静态资源请求(如图片、CSS、JS),保留核心业务请求。
- 导出为 JMeter 脚本:选择
File → Export to JMeter,保存为 .jmx 文件。
最佳实践:录制前在 Badboy 中设置“Record → Start Recording”时勾选“Clear Log”,避免历史请求干扰。导出后建议在 JMeter 中检查请求顺序和参数编码。
4.3 使用 JMeter HTTP(S) 测试脚本录制器
JMeter 内置的 HTTP(S) 测试脚本录制器通过代理模式捕获浏览器请求,无需额外安装工具。配置步骤如下:
- 添加录制器:在测试计划中右键 →
添加 → 非测试元件 → HTTP(S) 测试脚本录制器。 - 配置代理端口:默认端口 8888,建议使用未被占用的端口(如 8088)。
- 设置目标控制器:指定录制生成的采样器存放位置(如线程组下的“录制控制器”)。
- 配置浏览器代理:将浏览器 HTTP/HTTPS 代理设置为
127.0.0.1:8888。 - 安装 HTTPS 证书:若录制 HTTPS 请求,需在浏览器中导入 JMeter 生成的 CA 证书(位于
bin/ApacheJMeterTemporaryRootCA.crt)。 - 开始录制:点击录制器面板的“启动”按钮,在浏览器中执行业务操作。
- 停止并保存:操作完成后点击“停止”,录制器自动将请求添加到目标控制器中。
注意事项:录制完成后务必关闭浏览器代理,否则会影响正常上网。HTTPS 录制时若出现证书错误,需在浏览器中信任该证书,或使用 HTTP 协议进行录制。
4.4 回放验证流程
录制完成后,必须通过回放验证脚本的正确性。回放验证的核心目标是确认录制脚本能够成功复现业务操作,且响应数据符合预期。
回放验证三步法:
- 单线程回放:使用 1 个线程、1 次循环执行脚本,检查每个请求的响应状态码是否为 200/302,响应体是否包含关键业务字段。
- 参数化验证:将录制中的硬编码参数(如用户名、订单号)替换为变量,使用 CSV 数据文件或函数助手生成动态数据。
- 断言检查:添加响应断言,验证业务成功标识(如“登录成功”、“操作完成”),避免仅依赖状态码。
以下是一个典型的回放验证脚本结构示例:
<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="5.0">
<hashTree>
<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="录制回放验证">
<elementProp name="TestPlan.user_defined_variables">
<stringProp name="username">test_user</stringProp>
<stringProp name="password">test_pass</stringProp>
</elementProp>
</TestPlan>
<hashTree>
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="单线程回放">
<intProp name="ThreadGroup.num_threads">1</intProp>
<intProp name="ThreadGroup.loop_count">1</intProp>
</ThreadGroup>
<hashTree>
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="登录请求">
<stringProp name="HTTPSampler.domain">example.com</stringProp>
<stringProp name="HTTPSampler.path">/login</stringProp>
<stringProp name="HTTPSampler.method">POST</stringProp>
<elementProp name="HTTPsampler.Arguments">
<collectionProp name="Arguments.arguments">
<elementProp name="username">
<stringProp name="Argument.value">${username}</stringProp>
</elementProp>
<elementProp name="password">
<stringProp name="Argument.value">${password}</stringProp>
</elementProp>
</collectionProp>
</elementProp>
</HTTPSamplerProxy>
<hashTree>
<ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="登录断言">
<stringProp name="Assertion.test_field">806856</stringProp>
<stringProp name="Assertion.test_string">登录成功</stringProp>
</ResponseAssertion>
</hashTree>
</hashTree>
</hashTree>
</hashTree>
</jmeterTestPlan>
4.5 录制脚本的常见问题与处理
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 录制后请求过多 | 未过滤静态资源(图片、CSS、JS) | 在录制器中添加 URL 过滤规则,排除 .*\.(png|jpg|css|js) |
| 回放时 404 错误 | 请求路径包含动态 Session ID 或 | 使用正则表达式提取器捕获动态值,并关联到后续请求 |
| HTTPS 录制失败 | 未安装 JMeter 根证书或证书不受信任 | 重新生成证书并导入浏览器受信任根证书颁发机构 |
| 回放响应为空 | 请求头缺少必要字段(如 Cookie、Referer) | 添加 HTTP 信息头管理器,复制录制时的请求头 |
4.6 录制脚本的巡检适配建议
在双引擎巡检场景中,录制脚本通常作为初始脚本模板,后续需进行以下适配:
- 参数化改造:将录制中的固定数据(如用户名、密码、搜索关键词)替换为变量,支持巡检数据动态注入。
- 断言增强:添加业务级断言(如响应体包含“success”:true),而非仅检查状态码。
- 事务拆分:将录制脚本按业务模块拆分为独立事务控制器,便于在 k6 中映射为独立的巡检检查点。
- 关联处理:使用正则表达式提取器或 JSON 提取器处理动态 、Session ID,确保脚本可重复执行。
巡检脚本编排提示:录制脚本在 JMeter 中完成参数化和断言后,可导出为 CSV 或 JSON 格式的请求列表,供 k6 脚本生成器解析,实现双引擎脚本复用。
4.7 双引擎视角下的录制脚本转换
录制脚本在 JMeter 中验证通过后,可转换为 k6 脚本。转换时需注意以下差异:
| 转换要素 | JMeter 录制脚本 | k6 脚本对应实现 |
|---|---|---|
| 请求定义 | HTTPSamplerProxy 节点 | http.get() / http.post() |
| 参数传递 | Arguments 集合 | 对象参数 { username: 'test' } |
| 关联提取 | 正则表达式提取器 | response.json() 或 response.html() |
| 断言 | 响应断言 | check(response, { 'status is 200': (r) => r.status === 200 }) |
| 事务控制 | 事务控制器 | group('事务名称', () => { ... }) |
转换工具推荐:使用
jmeter-to-k6 开源工具(npm 包)可将 .jmx 文件批量转换为 k6 脚本,转换后需手动调整动态参数和断言逻辑。
通过以上录制、回放与转换流程,你可以快速构建双引擎巡检脚本的初始版本,为后续的巡检编排奠定基础。