- 性能测试
- 接口测试
- 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.
导读
本文基于 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.jsonreport命令用于把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 之前,建议先在本地验证测试脚本:
安装 Artillery(
npm install -g artillery,或直接复用官方 Docker 镜像artilleryio/artillery:latest);在 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.
相关推荐
在 GitHub Actions 中运行 RedwoodJS 测试:CI/CD 与 Postgres 测试数据库完整指南
在 GitHub Actions 中运行 RedwoodJS 测试:CI/CD 与 Postgres 测试数据库完整指南 RedwoodJS 提供了一套开箱即用
后端前端Web框架开发工具在 GitHub Actions 中运行 Redwood 测试:从 CI 到数据库 CD 的完整实战指南
在 GitHub Actions 中运行 Redwood 测试:从 CI 到数据库 CD 的完整实战指南 良好的测试策略是任何项目的基石。Redwood 提供了
后端前端Web框架开发工具在 GitHub Actions 中运行 Redwood 测试:从 CI 到数据库 CD 的完整实践指南
在 GitHub Actions 中运行 Redwood 测试:从 CI 到数据库 CD 的完整实践指南 对于任何项目来说,良好的测试策略都至关重要。Redwo
后端前端Web框架开发工具
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考