k6 负载测试

脚本结构与基础 HTTP

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.org/get'); check(res, { '状态码为 200': (r) => r.status === 200, '响应时间 < 500ms': (r) => r.timings.duration < 500, }); sleep(1); } // 运行:k6 run script.js // 参数覆盖:k6 run --vus 20 --duration 60s script.js

Stages — 渐进加压

export const options = { stages: [ { duration: '30s', target: 10 }, // 升至 10 VU { duration: '1m', target: 10 }, // 维持 10 VU { duration: '20s', target: 50 }, // 突增至 50 VU { duration: '1m', target: 50 }, // 维持峰值 { duration: '30s', target: 0 }, // 降至 0 ], };

Thresholds — 通过/失败标准

export const options = { thresholds: { http_req_failed: ['rate<0.01'], // 错误率 < 1% http_req_duration: ['p(95)<500'], // P95 响应时间 < 500ms 'http_req_duration{expected_response:true}': ['p(99)<1000'], // 超过阈值时中止测试 http_req_failed: [{ threshold: 'rate<0.05', abortOnFail: true }], }, };

自定义指标

import { Counter, Gauge, Rate, Trend } from 'k6/metrics'; const loginDuration = new Trend('login_duration'); const loginSuccessRate = new Rate('login_success_rate'); const totalRequests = new Counter('total_requests'); export default function () { const start = Date.now(); const res = http.post('/api/login', JSON.stringify({ user: 'alice' }), { headers: { 'Content-Type': 'application/json' }, }); loginDuration.add(Date.now() - start); loginSuccessRate.add(res.status === 200); totalRequests.add(1); }

Scenarios 场景配置

export const options = { scenarios: { constant_load: { executor: 'constant-vus', vus: 20, duration: '2m', }, constant_rps: { executor: 'constant-arrival-rate', rate: 100, // 每秒 100 个请求 timeUnit: '1s', duration: '2m', preAllocatedVUs: 50, }, }, };

CLI 命令与输出

k6 run script.js k6 run -e AUTH_TOKEN=abc123 script.js k6 run --out json=results.json script.js k6 run --out influxdb=http://localhost:8086/k6 script.js k6 run --summary-export=summary.json script.js # 主要内置指标: # http_req_duration — 响应时间(min/avg/max/p90/p95) # http_req_failed — 错误率 # http_reqs — 总请求数 # vus — 当前活跃虚拟用户数