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 脚本。以下是标准操作流程:

  1. 启动 Badboy:打开 Badboy 应用,默认进入录制模式(红色录制按钮高亮)。
  2. 输入目标 URL:在地址栏输入被测应用的入口地址,点击“Go”开始录制。
  3. 执行业务操作:在 Badboy 内嵌浏览器中完成登录、查询、提交等业务流程。
  4. 停止录制:点击红色录制按钮停止捕获。
  5. 清理脚本:删除不必要的静态资源请求(如图片、CSS、JS),保留核心业务请求。
  6. 导出为 JMeter 脚本:选择 File → Export to JMeter,保存为 .jmx 文件。
最佳实践:录制前在 Badboy 中设置“Record → Start Recording”时勾选“Clear Log”,避免历史请求干扰。导出后建议在 JMeter 中检查请求顺序和参数编码。

4.3 使用 JMeter HTTP(S) 测试脚本录制器

JMeter 内置的 HTTP(S) 测试脚本录制器通过代理模式捕获浏览器请求,无需额外安装工具。配置步骤如下:

  1. 添加录制器:在测试计划中右键 → 添加 → 非测试元件 → HTTP(S) 测试脚本录制器。
  2. 配置代理端口:默认端口 8888,建议使用未被占用的端口(如 8088)。
  3. 设置目标控制器:指定录制生成的采样器存放位置(如线程组下的“录制控制器”)。
  4. 配置浏览器代理:将浏览器 HTTP/HTTPS 代理设置为 127.0.0.1:8888。
  5. 安装 HTTPS 证书:若录制 HTTPS 请求,需在浏览器中导入 JMeter 生成的 CA 证书(位于 bin/ApacheJMeterTemporaryRootCA.crt)。
  6. 开始录制:点击录制器面板的“启动”按钮,在浏览器中执行业务操作。
  7. 停止并保存:操作完成后点击“停止”,录制器自动将请求添加到目标控制器中。
注意事项:录制完成后务必关闭浏览器代理,否则会影响正常上网。HTTPS 录制时若出现证书错误,需在浏览器中信任该证书,或使用 HTTP 协议进行录制。

4.4 回放验证流程

录制完成后,必须通过回放验证脚本的正确性。回放验证的核心目标是确认录制脚本能够成功复现业务操作,且响应数据符合预期。

回放验证三步法:
  1. 单线程回放:使用 1 个线程、1 次循环执行脚本,检查每个请求的响应状态码是否为 200/302,响应体是否包含关键业务字段。
  2. 参数化验证:将录制中的硬编码参数(如用户名、订单号)替换为变量,使用 CSV 数据文件或函数助手生成动态数据。
  3. 断言检查:添加响应断言,验证业务成功标识(如“登录成功”、“操作完成”),避免仅依赖状态码。

以下是一个典型的回放验证脚本结构示例:

<?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 脚本生成器解析,实现双引擎脚本复用。
JMeter 脚本录制与回放验证流程 1. 选择录制工具 Badboy / JMeter 录制器 2. 配置代理/浏览器 3. 执行业务操作 4. 停止录制并导出 .jmx 5. 清理冗余请求 过滤静态资源 6. 参数化与关联 替换变量 + 提取器 7. 单线程回放 检查状态码 8. 添加断言 验证业务字段 录制脚本需经过“清理 → 参数化 → 回放验证”三步,才能用于巡检脚本编排 回放通过后,方可进入双引擎脚本转换与参数化适配阶段

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 脚本,转换后需手动调整动态参数和断言逻辑。

通过以上录制、回放与转换流程,你可以快速构建双引擎巡检脚本的初始版本,为后续的巡检编排奠定基础。