name: k6-load-testing title: k6 负载压力测试 description: 当需要对 HTTP API、WebSocket 或浏览器场景做负载/压力/容量验证时使用;用 k6 编写 JS 测试脚本、配置 VUs/stages/thresholds(SLA)、分析结果并接入 CI/CD,产出可执行测试与达标报告;不适用于单元/接口功能测试与无脚本的纯监控。触发词:k6、负载测试、压测 domain: 研发/testing triggers: [k6, 负载测试, 压力测试, 性能压测, load testing, stress test, SLA 验证, VUs 并发, thresholds 阈值, 性能回归] tags: [k6, 负载测试, 性能测试, 压测, api测试, ci/cd, sla] level: 进阶 status: stable agents: [claude-code, codex, cursor, gemini-cli] tools: [k6, claude, cursor, gemini] requires: [] related: [playwright-e2e-testing, api-test-suite-builder, webapp-testing, javascript-testing-patterns] combines_with: [performance-profiler, grafana-dashboards, slo-sli-implementation] license: MIT source: sickn33/antigravity-awesome-skills source_license: MIT
何时使用
适用:
- 对 HTTP API、WebSocket 端点或浏览器(k6 Browser)场景做性能测试。
- 在 CI/CD 中建立性能回归门禁,对比代码改动前后的性能。
- 评估系统在不同负载下的表现:冒烟(Smoke)、负载(Load)、压力(Stress)、尖刺(Spike)、浸泡(Soak)。
- 校验 SLA / 性能预算(如 p95 < 500ms、错误率 < 1%)。
不该用:
- 功能正确性验证(用单元/接口测试,而非负载测试)。
- 无脚本的纯线上监控(用 APM/Prometheus 等,k6 是主动施压工具)。
- 缺少目标、权限或成功标准时,先澄清再动手,勿对生产系统盲目施压。
步骤
- 安装 k6(见下方指令)。
- 写最小脚本,先用 1-5 VUs 跑冒烟测试,确认脚本本身可用。
- 选定测试类型并配置
options(vus/duration或stages渐增渐减)。 - 加
thresholds表达 SLA,使阈值失败时 k6 返回非零退出码(CI 可据此判失败)。 - 用
check()断言响应;按需做请求链、参数化、SharedArray加载外部数据。 - 运行并导出结果(JSON / InfluxDB+Grafana / Prometheus / cloud)。
- 接入 CI/CD(GitHub Actions / GitLab CI),按需归档 results.json。
测试类型速查:
| 类型 | 用途 | 配置要点 |
|---|---|---|
| Smoke 冒烟 | 验证脚本基本可用 | 低 VUs(1-5)、短时长 |
| Load 负载 | 常规预期负载 | 按真实流量设目标 VUs |
| Stress 压力 | 找崩溃临界点 | 超出容量持续加压 |
| Spike 尖刺 | 突发流量冲击 | 快速拉升再骤降 |
| Soak 浸泡 | 长期稳定性 | 超长时长运行 |
指令
# 安装
brew install k6 # macOS
choco install k6 # Windows
# Linux: 见 k6 官方 apt 源安装
k6 install chromium # 浏览器测试支持
# 运行与结果输出
k6 run load-test.js # 文本摘要
k6 run --out json=results.json load-test.js # JSON 便于解析
k6 run --out influxdb=http://localhost:8086/k6 load-test.js
k6 run --out prometheus=localhost:9090/k6 load-test.js
k6 run --out cloud load-test.js
关键结果指标判读:http_req_duration(p95) 好<300ms / 警告 300-500ms / 差>500ms;http_req_failed 好<0.1% / 警告 0.1-1% / 差>1%。
示例
最小冒烟脚本:
// simple-test.js
import http from 'k6/http';
import { check, sleep } from 'k6';
export const options = { vus: 10, duration: '30s' };
export default function () {
const res = http.get('https://httpbin.test.k6.io/get');
check(res, {
'status is 200': (r) => r.status === 200,
'response time < 500ms': (r) => r.timings.duration < 500,
});
sleep(1);
}
渐增负载 + SLA 阈值:
export const options = {
stages: [
{ duration: '30s', target: 20 }, // 渐增
{ duration: '1m', target: 100 }, // 维持
{ duration: '30s', target: 0 }, // 渐降
],
thresholds: {
http_req_duration: ['p(95)<500'], // 95% 请求 < 500ms
http_req_failed: ['rate<0.01'], // 错误率 < 1%
},
};
带鉴权 + 参数化(SharedArray 共享数据,避免内存膨胀):
import http from 'k6/http';
import { check } from 'k6';
import { SharedArray } from 'k6/data';
const users = new SharedArray('users', () => JSON.parse(open('./users.json')));
export default function () {
const user = users[__VU % users.length];
const loginRes = http.post('https://api.example.com/login',
JSON.stringify({ email: user.email, password: user.password }));
const token = loginRes.json('access_token');
const res = http.get('https://api.example.com/profile',
{ headers: { Authorization: `Bearer ${token}` } });
check(res, { 'profile loaded': (r) => r.status === 200 });
}
CI(GitHub Actions)核心步骤:用 grafana/k6-action@v0.2.0 安装,k6 run --out json=results.json load-test.js 运行,再 actions/upload-artifact 归档;阈值失败时 k6 退出码非零,job 自动失败。GitLab CI 用 image: grafana/k6:latest + script: k6 run load-test.js。
注意事项
- 先冒烟后放大:1-5 VUs 验证脚本,再逐步加压。
- 用真实数据参数化,用
tags(如tags: { endpoint: 'users' })做细粒度分析。 - 阈值贴合 SLA,从宽到严按历史数据收紧;用 stages 预留预热时间。
- 监控不只自家 API,也要看下游依赖;一个场景一个脚本,保持聚焦。
- 常见坑:本地通过 CI 失败(核对 CI 资源与网络);多次跑结果不稳(排查外部依赖/随机数据/测试数据污染);k6 内存溢出(大数据用
SharedArray、减少 VUs 或--max-memory);阈值过严(先放宽再迭代)。 - 安全:勿对未授权或生产系统盲目施压;输出需经环境特定验证,不能替代专家评审。
互见
performance-engineer:更广义的性能优化。api-testing-observability-api-mock:测试期 API 打桩/Mock。application-performance-performance-optimization:性能优化。- 资源:k6 文档 https://k6.io/docs/ ,示例 https://github.com/grafana/k6/tree/master/examples 。
采编自 sickn33/antigravity-awesome-skills(MIT)。