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 — 当前活跃虚拟用户数