最近看到 TesterHome 社区孙高飞老师分享的《AI 提效:编写性能测试的 skills 实战》,文章基于 CodeBuddy + Locust 构建了一套完整的性能测试 Skill。核心思路是三层架构:
这个思路非常好。但我们团队用的是 k6 而不是 Locust,所以我基于 Kiro IDE 的 Skills 机制,参考原文方案做了一版 k6 适配和优化,并实际跑通了一个压测场景。下面分享整个过程。
直接照搬原文方案到 k6 是不合适的,k6 有自己的生态优势。我做了以下关键优化:
| 优化点 | 原文(Locust) | 优化后(k6) |
|---|---|---|
| 脚本语言 | Python | JavaScript(k6 原生) |
| 指标上报 | 手动 fire_success/fire_failure | k6 内置 Trend/Counter/Rate/Gauge |
| 负载模型 | Locust User 类 | k6 Scenarios(constant-vus/ramping-vus/constant-arrival-rate 等) |
| 数据驱动 | 自己实现 Queue 消耗方案 | k6 原生 SharedArray |
| 通过/失败判定 | 人工看数据 | k6 Thresholds 自动判定 |
| 数据准备脚本 | Python | Node.js(与 k6 统一 JS 生态) |
| 新增能力 | 无 | 场景模板(templates/)+ 结果分析流程 |
其中最关键的是 Thresholds 自动判定——脚本自带通过/失败标准,跑完 k6 自动出结论,退出码 0 表示通过、99 表示失败,天然适合 CI/CD 集成。
最终构建的 Skill 目录如下:
.kiro/skills/k6-perf-test/
├── SKILL.md # 工作流定义(大脑)
├── assets/ # 运行时资产文件
│ └── test-results/ # 压测结果输出
├── references/ # 参考手册
│ ├── k6-cookbook.md # k6 脚本编写 Cookbook(核心)
│ └── api-notes.md # API 接口说明
├── scripts/
│ ├── data-prep/ # 数据准备脚本(Node.js)
│ │ ├── create-spaces.mjs
│ │ ├── create-apps.mjs
│ │ ├── create-users.mjs
│ │ ├── add-users-to-space.mjs
│ │ └── utils/ # 公共工具(api-client/asset-store/batch-runner)
│ └── k6/ # 开箱即用的 k6 压测脚本
│ ├── http-api-perf.js # 通用 HTTP API 压测模板
│ ├── list-app-perf.js # 查询应用列表
│ ├── list-space-perf.js # 查询空间列表
│ └── helpers/ # 可复用辅助模块(auth/metrics/data-loader)
└── templates/ # 场景模板
├── scenario-constant-vus.js # 恒定并发
├── scenario-ramping.js # 阶梯加压
└── scenario-arrival-rate.js # 恒定 RPS
沿用了原文的三层架构,同时新增了 templates/ 目录。k6 的 Scenarios 模式是有限且固定的(5 种),直接提供模板比纯 Cookbook 文字描述更精确,AI 可以直接基于模板修改而不是从零生成。
SKILL.md 定义了 4 个入口和 3 个流程:
入口 A:用户说"我要做性能测试"(意图模糊)→ 询问确认 → 分流
入口 B:用户明确要求组装脚本 → 直接进入流程 2
入口 C:用户明确要求数据准备 → 直接进入流程 1
入口 D:用户提供了压测结果文件 → 直接进入流程 3(结果分析)
流程 2(组装 k6 脚本)的核心步骤:
流程 3(结果分析)是相比原文新增的——读取 k6 JSON summary,生成可读报告,对比 Thresholds 判定是否通过。
Cookbook 是整个 Skill 最关键的文件,共 11 章,覆盖了 k6 脚本编写的方方面面:
__ENV 读取模式)有了这份 Cookbook,AI 生成的脚本就不会天马行空,而是严格遵循规范。
Skill 构建完成后,我直接用自然语言发起了一次压测:
"我要对 https://staging.xxxxxxxxxx.cn/ 的获取 App 接口进行压力测试"
AI 按照 SKILL.md 的流程 2 开始收集需求,我提供了:
/form/api/project/list-with-permission
AI 参考 Cookbook 生成了完整的 k6 脚本:
import http from 'k6/http';
import { check, sleep } from 'k6';
const BASE_URL = __ENV.BASE_URL || 'https://staging.xxxxxxxxxxxx.cn';
const TOKEN = __ENV.TOKEN || '';
export const options = {
insecureSkipTLSVerify: true,
scenarios: {
constant_load: {
executor: 'constant-vus',
vus: parseInt(__ENV.VUS || '10'),
duration: __ENV.DURATION || '1m',
},
},
thresholds: {
http_req_duration: ['p(95)<500'],
http_req_failed: ['rate==0'],
checks: ['rate==1'],
},
};
export default function () {
const res = http.get(`${BASE_URL}/form/api/project/list-with-permission`, {
headers: {
'Authorization': TOKEN,
'Content-Type': 'application/json',
},
tags: { name: 'list-app-with-permission' },
});
check(res, {
'status is 200': (r) => r.status === 200,
'response has data': (r) => {
try {
const body = r.json();
return body !== null && body !== undefined;
} catch (e) {
return false;
}
},
'response time < 500ms': (r) => r.timings.duration < 500,
});
sleep(1);
}
执行过程中遇到了一个小插曲:staging 环境的 SSL 证书过期了,所有请求都因 TLS 验证失败而报错。AI 自动识别了问题,在 options 中加上 insecureSkipTLSVerify: true 后重新执行,顺利跑通。
█ THRESHOLDS
checks
✗ 'rate==1' rate=99.33%
http_req_duration
✓ 'p(95)<500' p(95)=289.23ms
http_req_failed
✓ 'rate==0' rate=0.00%
█ TOTAL RESULTS
✓ status is 200
✓ response has data
✗ response time < 500ms
↳ 98% — ✓ 490 / ✗ 10
HTTP
http_req_duration..: avg=215.47ms min=182.22ms med=202.63ms max=544.32ms
p(90)=239.27ms p(95)=289.23ms
http_req_failed....: 0.00% (0 out of 500)
http_reqs..........: 500 8.19/s
AI 给出的结果分析:
| 指标 | 结果 | 判定 |
|---|---|---|
| 总请求数 | 500 | - |
| RPS | 8.19 req/s | - |
| 错误率 | 0.00% | ✅ 通过 |
| 平均响应时间 | 215.47ms | - |
| P90 | 239.27ms | - |
| P95 | 289.23ms | ✅ 通过(< 500ms) |
| 最大响应时间 | 544.32ms | - |
| 响应时间 < 500ms | 98%(490/500) | 有 10 个请求超标 |
结论:接口整体表现不错,P95 在 289ms,错误率为 0。但有 10 个请求(2%)响应时间超过 500ms(最大 544ms),导致 checks 的 100% 通过率阈值未达标。这些慢请求可能是偶发的后端延迟或冷启动导致的。
原文提出的 SKILL.md + scripts + references 三层架构,迁移到 k6 后依然成立:
在 Skill 场景下,k6 有几个天然优势:
k6 的 Scenarios 模式是有限且固定的,直接提供模板文件比纯 Cookbook 文字描述更精确。AI 基于模板修改比从零生成靠谱得多,这是对原文方案的一个有效补充。
整个过程从提出需求到拿到压测报告,只需要几句自然语言对话。Skill 的价值在于把性能测试的专业知识沉淀下来,让 AI 每次都能按照最佳实践执行,而不是每次自由发挥。
本文基于 Kiro IDE 的 Skills 机制实现,参考了 TesterHome 社区孙高飞老师的原文方案。感谢原作者的分享。