☰
在 GitHub Actions 中运行 Artillery 负载测试:完整 CI/CD 集成指南
2026/9/25 2:56:20 网站建设 项目流程
  • 性能测试
  • 接口测试
  • CLI

【免费下载链接】artillery

The complete load testing platform. Everything you need for production-grade load tests. Serverless & distributed. Load test with Playwright. Load test HTTP APIs, GraphQL, WebSocket, and more. Use any Node.js module.

项目地址:https://gitcode.com/gh_mirrors/ar/artillery
点击查看免费下载

导读

本文基于 Artillery 仓库中的 examples/cicd/github-actions 示例,讲解如何将 Artillery 负载测试接入 GitHub Actions:包括测试脚本(Socket.IO 场景)的编写、workflow 的触发方式(push 与定时调度)、在容器化环境中执行测试、生成 HTML 报告并归档为 Actions artifact。读完本文后,你将能够在自己的仓库中搭建一套"代码推送即触发、每日定时回归、报告可追溯"的负载测试流水线,并理解每个配置项背后的实现原理。

示例概览:目录结构与职责划分

该示例的目录结构非常精简,体现了"测试脚本与 CI 编排分离"的实践:

  • tests/performance/socket-io.yml:Artillery 负载测试脚本,定义了压测目标、负载阶段与场景流程;
  • .github/workflows/load-test.yml:GitHub Actions workflow,负责在 CI 环境中执行上述脚本并产出报告。

整个仓库的 CI/CD 示例不止 GitHub Actions 一种,examples/cicd/README.md 中还收录了 Azure DevOps、CircleCI、GitLab CI/CD、Jenkins 与 AWS CodeBuild 的对应版本,可以作为横向参考——各平台在"测试脚本 + 平台编排"这一结构上是一致的。

Artillery 测试脚本:一个可运行的 Socket.IO 压测场景

脚本全文与逐段解读

示例脚本 tests/performance/socket-io.yml 完整内容如下:

config: target: "http://lab.artillery.io" # As an example, we'll only run a single virtual user in this # test script. For real-world load testing, you'll want to # adjust your load phases according to your needs. phases: - duration: 1 arrivalRate: 1 ensure: maxErrorRate: 1 max: 500 scenarios: - name: "emit_an_event" engine: "socketio" flow: - emit: channel: "echo" data: "Hello from Artillery" response: channel: "echoResponse" data: "Hello from Artillery"

逐段说明:

  • config.target:被测服务的地址,这里指向 Artillery 官方提供的演示 Socket.IO 服务http://lab.artillery.io;
  • config.phases:负载阶段定义。这里只设置了一个持续 1 秒、每秒到达 1 个虚拟用户(arrivalRate: 1)的轻量阶段,用于演示流程可跑通。真实负载测试中应根据业务目标调整duration与arrivalRate(如需模拟峰值,可配置rampTo、多个 phase 组合等);
  • config.ensure:测试后置断言(由 artillery-plugin-ensure 提供)。maxErrorRate: 1表示错误率上限为 1%,max: 500表示单次请求最大耗时不得超过 500 ms,任一条件不满足即判定测试失败;
  • scenarios[0].engine: "socketio":声明使用 Socket.IO 引擎,而不是默认的 HTTP 引擎;
  • scenarios[0].flow:虚拟用户的行为流程。先向echo频道发送消息"Hello from Artillery",再期望在echoResponse频道收到内容完全一致的回显,以此验证"发送-回显"闭环成功。

源码视角:Socket.IO 引擎如何验证响应

从源码结构看,Socket.IO 引擎实现在 packages/artillery/lib/core/engine_socketio.ts,其中processResponse与isValid(见 engine_socketio.ts)负责校验response中的数据是否与服务端回传一致:

  • 若response.data为字符串,采用部分匹配(actualResponse.includes(expectedResponse)),即服务端回显只需包含期望内容即可;
  • 若为对象或数组,则进行深度相等比较(deepEqual);
  • 校验失败时会触发ee.emit('error', err),进而被ensure的maxErrorRate统计为错误请求。

也就是说,示例脚本中data: "Hello from Artillery"与response.data的配对,正是依赖这套校验逻辑来判断测试通过与否的。

GitHub Actions workflow:触发、执行与报告归档

workflow 完整内容

.github/workflows/load-test.yml 的完整内容如下:

name: Artillery Socket.IO Load Test on: push: branches: - main schedule: - cron: '0 0 * * *' jobs: artillery: runs-on: ubuntu-latest container: artilleryio/artillery:latest steps: - name: Checkout repository uses: actions/checkout@v2 - name: Make reports directory run: mkdir reports - name: Execute load tests run: /home/node/artillery/bin/run run --output reports/report.json tests/performance/socket-io.yml - name: Generate HTML report run: /home/node/artillery/bin/run report --output reports/report.html reports/report.json - name: Archive test report uses: actions/upload-artifact@v2 with: name: artillery-test-report path: reports/*

触发方式:代码推送 + 定时调度

workflow 配置了两种触发器(对应 README 中"任何代码推送到 main 分支后触发,并在每天 00:00 UTC 定时运行"的描述):

  • push:任意提交推送到main分支时自动触发负载测试,实现"每次合入都回归";
  • schedule:使用 cron 表达式'0 0 * * *'在每天 00:00(UTC)定时执行,实现周期性的基线回归,便于长期观察性能趋势。

执行环境:复用官方 Docker 镜像

runs-on: ubuntu-latest配合container: artilleryio/artillery:latest,让整个 job 直接在 Artillery 官方 Docker 镜像中运行,无需额外安装 Node.js 或npm install,也避免了依赖版本漂移带来的不确定性。

关键命令:测试执行与报告生成

  • 执行测试:/home/node/artillery/bin/run run --output reports/report.json tests/performance/socket-io.yml

    其中run是 Artillery 的 CLI 命令,--output(或-o)指定 JSON 报告输出路径,参数为测试脚本路径。这一步会完成负载注入并产生原始 JSON 日志。

  • 生成 HTML 报告:/home/node/artillery/bin/run report --output reports/report.html reports/report.json

    report命令用于把run产出的 JSON 日志转换为可读的 HTML 报告。从源码 packages/artillery/lib/cmds/report.ts 可以看到,--output/-o标志即用于"将 HTML 报告写入指定位置"(见 report.ts)。

    需要特别说明的是:当前仓库中该report命令已被标记为deprecated——执行时会打印弃用提示,建议改用 Artillery Cloud 来可视化、定制与分享测试结果(见 report.ts)。因此在沿用本示例时,可以接受控制台中的弃用提示,或考虑将报告环节迁移到 Artillery Cloud 工作流。

  • 归档产物:actions/upload-artifact@v2将reports/*(含report.json与report.html)打包为名为artillery-test-report的 artifact,供后续在 Actions 页面下载、或供后续 job 拉取使用。

执行流程小结

整个 job 的执行链路为:检出代码 → 创建reports目录 → 运行负载测试并输出 JSON → 将 JSON 转成 HTML 报告 → 归档产物。这一链路可以直接复制到自己的仓库中,只需替换测试脚本路径与(可选)调整ensure阈值。

本地验证与调试建议

在推送到 GitHub 触发 workflow 之前,建议先在本地验证测试脚本:

  1. 安装 Artillery(npm install -g artillery,或直接复用官方 Docker 镜像artilleryio/artillery:latest);

  2. 在 examples/cicd/github-actions 目录下执行:

    artillery run tests/performance/socket-io.yml

    即可观察虚拟用户连接、echo/echoResponse收发与ensure断言的执行情况;确认本地通过后再提交触发 CI,可显著减少流水线调试成本。

扩展方向

  • 将示例中的轻量阶段(1 秒、1 个 VU)替换为真实负载曲线(多 phase、rampTo、arrivalCount等),并让ensure阈值匹配业务 SLA;
  • 把 HTTP、GraphQL、WebSocket 等场景与 Socket.IO 场景拆分到不同脚本,按 job 并行执行;
  • 配合actions/checkout@v4与actions/upload-artifact@v4等新版本 action,或改用 Artillery Cloud 完成报告可视化与历史对比;
  • 参考 examples/cicd 下的其他平台示例(Azure DevOps、CircleCI、GitLab CI/CD、Jenkins、AWS CodeBuild),在同一套测试脚本基础上平移到不同 CI 系统。
  • 性能测试
  • 接口测试
  • CLI

【免费下载链接】artillery

The complete load testing platform. Everything you need for production-grade load tests. Serverless & distributed. Load test with Playwright. Load test HTTP APIs, GraphQL, WebSocket, and more. Use any Node.js module.

项目地址:https://gitcode.com/gh_mirrors/ar/artillery
点击查看免费下载

相关推荐

上一篇:Vue3仿抖音:3个手势与路由细节让竖滑体验接近原生
下一篇:CodiumAI PR-Agent自定义提示终极指南:完全掌控AI代码分析行为

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询