关于 performance-testing
面向性能测试规划与执行的技能,指导定义 SLO、构造真实负载场景、监控指标并定位瓶颈,也涵盖测试类型选择和基线比较。
主要功能
- 01定义响应时间、吞吐量和错误率 SLO
- 02规划负载、压力、突增及耐久测试
- 03模拟真实用户行为与关键路径
- 04监控资源并分析性能瓶颈
- 05对照基线追踪性能变化
适用场景
- 01发布前验证预期流量下的性能
- 02基础设施变更后评估扩展能力
- 03为业务流量高峰准备突增测试
- 04比较测试结果并定位退化原因
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ proffesor-for-testing/ agentic-qe --skill performance-testing安装后在 Claude Code 中输入/performance-testing确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
config.jsonrun-history.jsonevals/performance-testing.yamlreferences/k6-patterns.mdschemas/output.jsonscripts/validate-config.json详细介绍
性能测试
<default_to_action> 进行性能测试或规划负载测试时:
- 定义 SLO:p95 响应时间、吞吐量和错误率目标
- 识别关键路径:营收流程、高流量页面、关键 API
- 创建真实场景:用户旅程、思考时间、丰富多样的数据
- 执行并监控:CPU、内存、数据库查询、网络
- 分析瓶颈,并在上线前修复
快速选择测试类型:
- 验证预期负载 → 负载测试
- 找出性能极限 → 压力测试
- 应对流量骤增 → 峰值测试
- 内存泄漏、资源耗尽 → 耐久/浸泡测试
- 水平/垂直扩展 → 可扩展性测试
成功的关键因素:
- 性能是产品功能,而非事后补充
- 尽早且频繁地测试,而不只是发布前测试
- 聚焦影响用户的瓶颈 </default_to_action>
快速参考卡
适用时机
- 重大版本发布前
- 基础设施变更后
- 扩容活动前(黑色星期五)
- 制定 SLA/SLO 时
测试类型
| 类型 | 目的 | 时机 |
|---|---|---|
| 负载 | 预期流量 | 每次发布 |
| 压力 | 超出容量 | 每季度 |
| 峰值 | 流量骤增 | 活动前 |
| 耐久 | 内存泄漏 | 代码变更后 |
| 可扩展性 | 验证扩展能力 | 基础设施变更时 |
关键指标
| 指标 | 目标 | 原因 |
|---|---|---|
| p95 响应时间 | < 200ms | 用户体验 |
| 吞吐量 | 10k req/min | 容量 |
| 错误率 | < 0.1% | 可靠性 |
| CPU | < 70% | 余量 |
| 内存 | < 80% | 稳定性 |
工具
- k6:现代化、基于 JS、适合 CI/CD
- JMeter:企业级、功能丰富
- Artillery:简洁的 YAML 配置
- Gatling:基于 Scala,报告出色
Agent 协作
qe-performance-tester:负载测试编排qe-quality-analyzer:结果分析qe-production-intelligence:生产环境对比
定义 SLO
不佳:“系统应该很快” 良好:“在 1,000 个并发用户下,p95 响应时间 < 200ms”
export const options = {
thresholds: {
http_req_duration: ['p(95)<200'], // 95% < 200ms
http_req_failed: ['rate<0.01'], // < 1% failures
},
};
真实场景
**不佳:**所有用户都反复访问首页 **良好:**模拟真实用户行为
// Realistic distribution
// 40% browse, 30% search, 20% details, 10% checkout
export default function () {
const action = Math.random();
if (action < 0.4) browse();
else if (action < 0.7) search();
else if (action < 0.9) viewProduct();
else checkout();
sleep(randomInt(1, 5)); // Think time
}
常见瓶颈
数据库
**症状:**负载下查询缓慢、连接池耗尽 **解决方案:**添加索引、优化 N+1 查询、增大连接池、添加只读副本
N+1 查询
// BAD: 100 orders = 101 queries
const orders = await Order.findAll();
for (const order of orders) {
const customer = await Customer.findById(order.customerId);
}
// GOOD: 1 query
const orders = await Order.findAll({ include: [Customer] });
同步处理
**问题:**请求路径中的阻塞操作(结账时发送电子邮件) **解决方案:**使用消息队列、异步处理、立即返回
内存泄漏
**检测:**耐久测试、内存分析 **常见原因:**未清理事件监听器、没有驱逐机制的缓存
外部依赖
**解决方案:**设置激进的超时、使用熔断器、缓存、优雅降级
k6 CI/CD 示例
// performance-test.js
import http from 'k6/http';
import { check, sleep } from 'k6';
export const options = {
stages: [
{ duration: '1m', target: 50 }, // Ramp up
{ duration: '3m', target: 50 }, // Steady
{ duration: '1m', target: 0 }, // Ramp down
],
thresholds: {
http_req_duration: ['p(95)<200'],
http_req_failed: ['rate<0.01'],
},
};
export default function () {
const res = http.get('https://api.example.com/products');
check(res, {
'status is 200': (r) => r.status === 200,
'response time < 200ms': (r) => r.timings.duration < 200,
});
sleep(1);
}
# GitHub Actions
- name: Run k6 test
uses: grafana/[email protected]
with:
filename: performance-test.js
分析结果
良好结果
Load: 1,000 users | p95: 180ms | Throughput: 5,000 req/s
Error rate: 0.05% | CPU: 65% | Memory: 70%
问题
Load: 1,000 users | p95: 3,500ms ❌ | Throughput: 500 req/s ❌
Error rate: 5% ❌ | CPU: 95% ❌ | Memory: 90% ❌
根因分析
- 关联指标:响应时间飙升时,哪些指标发生了变化?
- 检查日志:错误、警告、慢查询
- 分析代码性能:时间都花在哪里?
- 监控资源:CPU、内存、磁盘
- 跟踪请求:端到端流程
反模式
| ❌ 反模式 | ✅ 更好的做法 |
|---|---|
| 测试太晚 | 尽早且频繁地测试 |
| 场景不真实 | 模拟真实用户行为 |
| 瞬间从 0 增至 1,000 个用户 | 逐步增加负载 |
| 测试期间不监控 | 监控所有指标 |
| 没有基线 | 建立基线并跟踪趋势 |
| 只测试一次 | 持续进行性能测试 |
Agent 辅助的性能测试
// Comprehensive load test
await Task("Load Test", {
target: 'https://api.example.com',
scenarios: {
checkout: { vus: 100, duration: '5m' },
search: { vus: 200, duration: '5m' },
browse: { vus: 500, duration: '5m' }
},
thresholds: {
'http_req_duration': ['p(95)<200'],
'http_req_failed': ['rate<0.01']
}
}, "qe-performance-tester");
// Bottleneck analysis
await Task("Analyze Bottlenecks", {
testResults: perfTest,
metrics: ['cpu', 'memory', 'db_queries', 'network']
}, "qe-performance-tester");
// CI integration
await Task("CI Performance Gate", {
mode: 'smoke',
duration: '1m',
vus: 10,
failOn: { 'p95_response_time': 300, 'error_rate': 0.01 }
}, "qe-performance-tester");
Agent 协作提示
内存命名空间
aqe/performance/
├── results/* - Test execution results
├── baselines/* - Performance baselines
├── bottlenecks/* - Identified bottlenecks
└── trends/* - Historical trends
Fleet 协作
const perfFleet = await FleetManager.coordinate({
strategy: 'performance-testing',
agents: [
'qe-performance-tester',
'qe-quality-analyzer',
'qe-production-intelligence',
'qe-deployment-readiness'
],
topology: 'sequential'
});
预生产检查清单
- 负载测试通过(符合预期流量)
- 压力测试通过(预期流量的 2-3 倍)
- 峰值测试通过(流量突然激增)
- 耐久性测试通过(24 小时以上)
- 已设置数据库索引
- 已配置缓存
- 已设置监控和告警
- 已建立性能基线
相关技能
- agentic-quality-engineering - Agent 协调
- api-testing-patterns - API 性能
- chaos-engineering-resilience - 韧性测试
请记住
性能是一项功能: 像测试功能一样测试性能 持续测试: 不要只在发布前测试 监控生产环境: 结合合成监控与真实用户监控 修复关键问题: 聚焦影响用户的瓶颈 跟踪趋势: 尽早发现性能退化
使用 Agent: Agent 可以自动执行负载测试、分析瓶颈并与生产环境进行比较。借助 Agent 在大规模场景下维持性能。
运行历史
每次性能测试运行后,将结果追加到此技能目录下的 run-history.json:
node -e "
const fs = require('fs');
const h = JSON.parse(fs.readFileSync('.claude/skills/performance-testing/run-history.json'));
h.runs.push({date: new Date().toISOString().split('T')[0], scenario: 'load', p95_ms: P95, throughput_rps: RPS, error_rate_pct: ERR});
fs.writeFileSync('.claude/skills/performance-testing/run-history.json', JSON.stringify(h, null, 2));
"
每次运行前读取 run-history.json,并与基线进行比较。如果 p95 比基线增加超过 20%,则发出告警。
注意事项
- Agent 生成的 k6 脚本通常会将基础 URL 写死——应使用环境变量以便移植
- 在容器中运行负载测试时,资源限制会先于应用限制触发——确保容器拥有目标资源量的 2 倍
- Agent 会忘记在请求之间加入思考时间——没有思考时间,负载会出现不真实的突发
- P95 与 P99 的差异很重要——Agent 默认使用平均值,会掩盖尾延迟问题
- 基线比较要求环境一致——CI 运行器的差异可能造成超过 20% 的噪声
评论
支持 Markdown