为什么要烟雾压测
- 性能劣化常来自小改动;在 CI 跑 1-3 分钟的基准可以提前报警。
- 关注接口 P95、失败率、超时率即可,不需要长时间打满。
k6 脚本示例
import http from 'k6/http';
import { check, sleep } from 'k6';
export let options = {
vus: 10,
duration: '1m',
thresholds: {
http_req_duration: ['p(95)<800'], // SLA
http_req_failed: ['rate<0.01'],
},
};
export default function () {
const res = http.get(`${__ENV.BASE_URL}/api/health`);
check(res, { 'status 200': (r) => r.status === 200 });
sleep(1);
}
GitHub Actions 集成
name: k6-smoke
on: [push, pull_request]
jobs:
smoke:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install k6
uses: grafana/setup-k6-action@v1
- name: Run k6 smoke
env:
BASE_URL: ${{ secrets.BASE_URL }}
run: k6 run tests/smoke.js
指标与可观测性
- 在 CI 阶段可以把
--out json=report.json上传为工件;若有 Prometheus/Grafana,可用--out influxdb=http://...上报。 - 若使用前后端分环境,配置
BASE_URL指向预发,避免污染正式数据。
阈值策略
- 阈值写在脚本里可读性高;也可以按环境切换,例如在 PR 环境放宽。
- 对核心接口设置单独阈值,避免被整体平均值掩盖。
总结
- k6 烟雾能在几分钟内发现明显劣化;阈值即质量门禁。
- 指标上报 + 可视化,能长期观察趋势;与变更关联,方便定位责任代码。