// Sub2API Health Check Performance Test // 健康检查接口性能测试 import http from 'k6/http'; import { check, sleep, group } from 'k6'; import { Rate, Trend, Counter } from 'k6/metrics'; import { getBaseUrl } from '../common/utils.js'; // ============= 自定义指标 ============= const healthCheckDuration = new Trend('health_check_duration'); const healthErrorRate = new Rate('health_errors'); // ============= 测试配置 ============= export const options = { scenarios: { health_load: { executor: 'ramping-vus', startVUs: 5, stages: [ { duration: '30s', target: 20 }, { duration: '2m', target: 50 }, { duration: '30s', target: 0 }, ], }, }, thresholds: { 'health_check_duration': ['p(95)<100', 'p(99)<200'], 'health_errors': ['rate<0.001'], }, }; // ============= 测试场景 ============= export default function () { group('Health Check', () => { const start = Date.now(); // 健康检查端点 const res = http.get(`${getBaseUrl()}/health`, { tags: { name: 'health_check' }, }); const duration = Date.now() - start; healthCheckDuration.add(duration); check(res, { 'Health: status is 200': (r) => r.status === 200, 'Health: has status field': (r) => r.json('status') !== undefined, 'Health: response time < 100ms': () => duration < 100, }); healthErrorRate.add(res.status !== 200); // 可选:详细健康检查 if (__VU % 10 === 0) { const detailedRes = http.get(`${getBaseUrl()}/health/detailed`, { tags: { name: 'health_detailed' }, }); check(detailedRes, { 'Detailed Health: status is 200': (r) => r.status === 200, }); } }); // 健康检查通常不需要太长的思考时间 sleep(0.01); } export function handleSummary(data) { return { 'health-performance-report.json': JSON.stringify(data, null, 2), 'health-performance-summary.txt': ` ================================================================================ Sub2API Health Check 性能测试报告 ================================================================================ 测试时间: ${new Date().toISOString()} 测试持续: ${(data.state.testRunDurationMs / 1000 / 60).toFixed(2)} 分钟 -------------------------------------------------------------------------------- 核心指标 -------------------------------------------------------------------------------- 总请求数: ${data.metrics?.requests_total?.values?.count || 0} 错误率: ${((data.metrics?.health_errors?.values?.rate || 0) * 100).toFixed(3)}% 平均响应时间: ${data.metrics?.health_check_duration?.values?.avg?.toFixed(2) || 0} ms P50 响应时间: ${data.metrics?.health_check_duration?.values?.['p(50)']?.toFixed(2) || 0} ms P95 响应时间: ${data.metrics?.health_check_duration?.values?.['p(95)']?.toFixed(2) || 0} ms P99 响应时间: ${data.metrics?.health_check_duration?.values?.['p(99)']?.toFixed(2) || 0} ms 最大响应时间: ${data.metrics?.health_check_duration?.values?.max?.toFixed(2) || 0} ms ================================================================================ 测试完成 ================================================================================ `, }; }