k6-load-test by dengineproblem/agents-monorepo
npx skills add https://github.com/dengineproblem/agents-monorepo --skill k6-load-test精通使用 k6 框架进行性能测试。
import http from 'k6/http';
import { check, sleep } from 'k6';
import { Rate, Trend } from 'k6/metrics';
// 自定义指标
const errorRate = new Rate('errors');
const customTrend = new Trend('custom_duration');
// 测试配置
export const options = {
stages: [
{ duration: '2m', target: 10 }, // 逐步增加到 10 个用户
{ duration: '5m', target: 10 }, // 保持在 10 个用户
{ duration: '2m', target: 20 }, // 逐步增加到 20 个用户
{ duration: '5m', target: 20 }, // 保持在 20 个用户
{ duration: '2m', target: 0 }, // 逐步减少到 0
],
thresholds: {
http_req_duration: ['p(95)<500'], // 95% 的请求在 500ms 以下
http_req_failed: ['rate<0.1'], // 错误率低于 10%
errors: ['rate<0.1'],
},
};
// 设置函数(测试前运行一次)
export function setup() {
// 准备测试数据、身份验证等
const loginRes = http.post('https://api.example.com/auth/login', {
email: 'test@example.com',
password: 'password123',
});
return { token: loginRes.json('token') };
}
// 主测试函数(为每个 VU 运行)
export default function(data) {
const params = {
headers: {
'Authorization': `Bearer ${data.token}`,
'Content-Type': 'application/json',
},
};
const response = http.get('https://api.example.com/users', params);
// 验证响应
check(response, {
'状态码为 200': (r) => r.status === 200,
'响应时间 < 500ms': (r) => r.timings.duration < 500,
'响应体包含 users': (r) => r.body.includes('users'),
});
// 跟踪自定义指标
errorRate.add(response.status !== 200);
customTrend.add(response.timings.duration);
// 请求间的思考时间
sleep(Math.random() * 2 + 1); // 1-3 秒
}
// 清理函数(测试后运行一次)
export function teardown(data) {
// 清理操作
console.log('测试完成');
}
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
export const options = {
stages: [
{ duration: '5m', target: 50 }, // 逐步增加
{ duration: '30m', target: 50 }, // 稳定状态
{ duration: '5m', target: 0 }, // 逐步减少
],
thresholds: {
http_req_duration: ['p(95)<200', 'p(99)<500'],
http_req_failed: ['rate<0.01'],
},
};
export const options = {
stages: [
{ duration: '2m', target: 100 },
{ duration: '5m', target: 100 },
{ duration: '2m', target: 200 },
{ duration: '5m', target: 200 },
{ duration: '2m', target: 300 }, // 超出正常容量
{ duration: '5m', target: 300 },
{ duration: '10m', target: 400 }, // 突破点
{ duration: '2m', target: 0 },
],
};
export const options = {
stages: [
{ duration: '10s', target: 100 }, // 快速增加
{ duration: '1m', target: 100 }, // 保持在峰值
{ duration: '10s', target: 0 }, // 快速减少
],
};
export const options = {
stages: [
{ duration: '5m', target: 50 },
{ duration: '4h', target: 50 }, // 运行 4 小时
{ duration: '5m', target: 0 },
],
};
export const options = {
executor: 'ramping-arrival-rate',
stages: [
{ duration: '2m', target: 100 },
{ duration: '2m', target: 200 },
{ duration: '2m', target: 300 },
{ duration: '2m', target: 400 },
{ duration: '2m', target: 500 },
// 持续直到系统崩溃
],
};
import { SharedArray } from 'k6/data';
import papaparse from 'https://jslib.k6.io/papaparse/5.1.1/index.js';
// 一次性加载 CSV 数据,在 VU 间共享
const csvData = new SharedArray('users', function() {
return papaparse.parse(open('./users.csv'), { header: true }).data;
});
export default function() {
// 从数据集中随机选取用户
const user = csvData[Math.floor(Math.random() * csvData.length)];
const payload = JSON.stringify({
username: user.username,
password: user.password,
});
const response = http.post('https://api.example.com/login', payload, {
headers: { 'Content-Type': 'application/json' },
});
check(response, {
'登录成功': (r) => r.status === 200,
'令牌存在': (r) => r.json('token') !== '',
});
}
import { group, sleep } from 'k6';
import http from 'k6/http';
export default function() {
let authToken;
group('身份验证', function() {
const loginRes = http.post('https://api.example.com/auth/login', {
email: 'user@example.com',
password: 'password123',
});
check(loginRes, { '登录成功': (r) => r.status === 200 });
authToken = loginRes.json('token');
});
const headers = { Authorization: `Bearer ${authToken}` };
group('浏览产品', function() {
const productsRes = http.get('https://api.example.com/products', { headers });
check(productsRes, { '产品已加载': (r) => r.status === 200 });
const productId = productsRes.json('products')[0].id;
const detailRes = http.get(`https://api.example.com/products/${productId}`, { headers });
check(detailRes, { '产品详情已加载': (r) => r.status === 200 });
});
group('加入购物车', function() {
const cartRes = http.post('https://api.example.com/cart',
JSON.stringify({ productId: 1, quantity: 2 }),
{ headers: { ...headers, 'Content-Type': 'application/json' } }
);
check(cartRes, { '已加入购物车': (r) => r.status === 200 });
});
group('结账', function() {
const checkoutRes = http.post('https://api.example.com/checkout',
JSON.stringify({ paymentMethod: 'card' }),
{ headers: { ...headers, 'Content-Type': 'application/json' } }
);
check(checkoutRes, { '结账成功': (r) => r.status === 200 });
});
sleep(1);
}
import http from 'k6/http';
export default function() {
const responses = http.batch([
['GET', 'https://api.example.com/users'],
['GET', 'https://api.example.com/products'],
['GET', 'https://api.example.com/orders'],
['POST', 'https://api.example.com/events', JSON.stringify({ event: 'page_view' }), {
headers: { 'Content-Type': 'application/json' },
}],
]);
check(responses[0], { 'users 状态码 200': (r) => r.status === 200 });
check(responses[1], { 'products 状态码 200': (r) => r.status === 200 });
check(responses[2], { 'orders 状态码 200': (r) => r.status === 200 });
}
import { Counter, Gauge, Rate, Trend } from 'k6/metrics';
// 定义自定义指标
const pageViews = new Counter('page_views');
const activeUsers = new Gauge('active_users');
const errorRate = new Rate('error_rate');
const responseTrend = new Trend('response_trend');
export default function() {
const response = http.get('https://api.example.com/page');
// 记录指标
pageViews.add(1);
activeUsers.add(__VU); // 当前 VU 数量
errorRate.add(response.status !== 200);
responseTrend.add(response.timings.duration);
// 用于分段的标签
pageViews.add(1, { page: 'home', version: 'v2' });
}
# 基本运行
k6 run script.js
# 指定 VU 和持续时间
k6 run --vus 50 --duration 10m script.js
# 环境变量
k6 run --env BASE_URL=https://staging.api.com --env API_KEY=xxx script.js
# 输出到不同的后端
k6 run --out influxdb=http://localhost:8086/k6 script.js
k6 run --out json=results.json script.js
k6 run --out csv=results.csv script.js
# 云端执行
k6 cloud script.js
# 使用配置文件运行
k6 run --config config.json script.js
const BASE_URL = __ENV.BASE_URL || 'https://api.example.com';
const API_KEY = __ENV.API_KEY || 'default-key';
const ENVIRONMENT = __ENV.ENV || 'staging';
export default function() {
const response = http.get(`${BASE_URL}/endpoint`, {
headers: { 'X-API-Key': API_KEY },
});
}
name: 负载测试
on:
push:
branches: [main]
schedule:
- cron: '0 2 * * *' # 每天凌晨 2 点
jobs:
load-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: 安装 k6
run: |
curl -L https://github.com/grafana/k6/releases/download/v0.47.0/k6-v0.47.0-linux-amd64.tar.gz | tar xvz
sudo mv k6-v0.47.0-linux-amd64/k6 /usr/local/bin/
- name: 运行负载测试
run: k6 run --env BASE_URL=${{ secrets.API_URL }} tests/load-test.js
- name: 上传结果
uses: actions/upload-artifact@v3
with:
name: k6-results
path: results.json
import { textSummary } from 'https://jslib.k6.io/k6-summary/0.0.1/index.js';
// 自定义摘要处理器
export function handleSummary(data) {
return {
'stdout': textSummary(data, { indent: ' ', enableColors: true }),
'summary.json': JSON.stringify(data),
};
}
export default function() {
const response = http.get('https://api.example.com/data');
// 失败时的详细调试信息
if (!check(response, { '状态码为 200': (r) => r.status === 200 })) {
console.error(`请求失败: ${response.status}`);
console.error(`响应体: ${response.body.substring(0, 500)}`);
console.error(`请求 URL: ${response.request.url}`);
}
// 记录慢请求
if (response.timings.duration > 1000) {
console.warn(`慢请求: ${response.timings.duration}ms - ${response.request.url}`);
}
}
| 指标 | 描述 | 典型阈值 |
|---|---|---|
http_req_duration | 响应时间 | p(95)<500ms |
http_req_failed | 失败请求率 | rate<0.01 |
http_reqs | 每秒请求数 | N/A(信息性) |
http_req_waiting | 首字节时间 | p(95)<200ms |
vus | 活跃虚拟用户数 | N/A |
iterations | 完成的迭代次数 | N/A |
sleep()每周安装数
72
代码仓库
GitHub 星标数
3
首次出现
2026年1月29日
安全审计
安装于
opencode69
gemini-cli68
github-copilot68
codex68
amp66
kimi-cli66
Expert in performance testing with k6 framework.
import http from 'k6/http';
import { check, sleep } from 'k6';
import { Rate, Trend } from 'k6/metrics';
// Custom metrics
const errorRate = new Rate('errors');
const customTrend = new Trend('custom_duration');
// Test configuration
export const options = {
stages: [
{ duration: '2m', target: 10 }, // Ramp up to 10 users
{ duration: '5m', target: 10 }, // Stay at 10 users
{ duration: '2m', target: 20 }, // Ramp up to 20 users
{ duration: '5m', target: 20 }, // Stay at 20 users
{ duration: '2m', target: 0 }, // Ramp down to 0
],
thresholds: {
http_req_duration: ['p(95)<500'], // 95% of requests under 500ms
http_req_failed: ['rate<0.1'], // Error rate under 10%
errors: ['rate<0.1'],
},
};
// Setup function (runs once before test)
export function setup() {
// Prepare test data, authenticate, etc.
const loginRes = http.post('https://api.example.com/auth/login', {
email: 'test@example.com',
password: 'password123',
});
return { token: loginRes.json('token') };
}
// Main test function (runs for each VU)
export default function(data) {
const params = {
headers: {
'Authorization': `Bearer ${data.token}`,
'Content-Type': 'application/json',
},
};
const response = http.get('https://api.example.com/users', params);
// Verify response
check(response, {
'status is 200': (r) => r.status === 200,
'response time < 500ms': (r) => r.timings.duration < 500,
'response body contains users': (r) => r.body.includes('users'),
});
// Track custom metrics
errorRate.add(response.status !== 200);
customTrend.add(response.timings.duration);
// Think time between requests
sleep(Math.random() * 2 + 1); // 1-3 seconds
}
// Teardown function (runs once after test)
export function teardown(data) {
// Cleanup operations
console.log('Test completed');
}
export const options = {
stages: [
{ duration: '5m', target: 50 }, // Ramp up
{ duration: '30m', target: 50 }, // Steady state
{ duration: '5m', target: 0 }, // Ramp down
],
thresholds: {
http_req_duration: ['p(95)<200', 'p(99)<500'],
http_req_failed: ['rate<0.01'],
},
};
export const options = {
stages: [
{ duration: '2m', target: 100 },
{ duration: '5m', target: 100 },
{ duration: '2m', target: 200 },
{ duration: '5m', target: 200 },
{ duration: '2m', target: 300 }, // Beyond normal capacity
{ duration: '5m', target: 300 },
{ duration: '10m', target: 400 }, // Breaking point
{ duration: '2m', target: 0 },
],
};
export const options = {
stages: [
{ duration: '10s', target: 100 }, // Quick ramp-up
{ duration: '1m', target: 100 }, // Stay at peak
{ duration: '10s', target: 0 }, // Quick ramp-down
],
};
export const options = {
stages: [
{ duration: '5m', target: 50 },
{ duration: '4h', target: 50 }, // Run for 4 hours
{ duration: '5m', target: 0 },
],
};
export const options = {
executor: 'ramping-arrival-rate',
stages: [
{ duration: '2m', target: 100 },
{ duration: '2m', target: 200 },
{ duration: '2m', target: 300 },
{ duration: '2m', target: 400 },
{ duration: '2m', target: 500 },
// Continue until system breaks
],
};
import { SharedArray } from 'k6/data';
import papaparse from 'https://jslib.k6.io/papaparse/5.1.1/index.js';
// Load CSV data once, share across VUs
const csvData = new SharedArray('users', function() {
return papaparse.parse(open('./users.csv'), { header: true }).data;
});
export default function() {
// Random user from dataset
const user = csvData[Math.floor(Math.random() * csvData.length)];
const payload = JSON.stringify({
username: user.username,
password: user.password,
});
const response = http.post('https://api.example.com/login', payload, {
headers: { 'Content-Type': 'application/json' },
});
check(response, {
'login successful': (r) => r.status === 200,
'token present': (r) => r.json('token') !== '',
});
}
import { group, sleep } from 'k6';
import http from 'k6/http';
export default function() {
let authToken;
group('Authentication', function() {
const loginRes = http.post('https://api.example.com/auth/login', {
email: 'user@example.com',
password: 'password123',
});
check(loginRes, { 'login successful': (r) => r.status === 200 });
authToken = loginRes.json('token');
});
const headers = { Authorization: `Bearer ${authToken}` };
group('Browse Products', function() {
const productsRes = http.get('https://api.example.com/products', { headers });
check(productsRes, { 'products loaded': (r) => r.status === 200 });
const productId = productsRes.json('products')[0].id;
const detailRes = http.get(`https://api.example.com/products/${productId}`, { headers });
check(detailRes, { 'product detail loaded': (r) => r.status === 200 });
});
group('Add to Cart', function() {
const cartRes = http.post('https://api.example.com/cart',
JSON.stringify({ productId: 1, quantity: 2 }),
{ headers: { ...headers, 'Content-Type': 'application/json' } }
);
check(cartRes, { 'added to cart': (r) => r.status === 200 });
});
group('Checkout', function() {
const checkoutRes = http.post('https://api.example.com/checkout',
JSON.stringify({ paymentMethod: 'card' }),
{ headers: { ...headers, 'Content-Type': 'application/json' } }
);
check(checkoutRes, { 'checkout successful': (r) => r.status === 200 });
});
sleep(1);
}
import http from 'k6/http';
export default function() {
const responses = http.batch([
['GET', 'https://api.example.com/users'],
['GET', 'https://api.example.com/products'],
['GET', 'https://api.example.com/orders'],
['POST', 'https://api.example.com/events', JSON.stringify({ event: 'page_view' }), {
headers: { 'Content-Type': 'application/json' },
}],
]);
check(responses[0], { 'users status 200': (r) => r.status === 200 });
check(responses[1], { 'products status 200': (r) => r.status === 200 });
check(responses[2], { 'orders status 200': (r) => r.status === 200 });
}
import { Counter, Gauge, Rate, Trend } from 'k6/metrics';
// Define custom metrics
const pageViews = new Counter('page_views');
const activeUsers = new Gauge('active_users');
const errorRate = new Rate('error_rate');
const responseTrend = new Trend('response_trend');
export default function() {
const response = http.get('https://api.example.com/page');
// Record metrics
pageViews.add(1);
activeUsers.add(__VU); // Current VU count
errorRate.add(response.status !== 200);
responseTrend.add(response.timings.duration);
// Tags for segmentation
pageViews.add(1, { page: 'home', version: 'v2' });
}
# Basic run
k6 run script.js
# Specify VUs and duration
k6 run --vus 50 --duration 10m script.js
# Environment variables
k6 run --env BASE_URL=https://staging.api.com --env API_KEY=xxx script.js
# Output to different backends
k6 run --out influxdb=http://localhost:8086/k6 script.js
k6 run --out json=results.json script.js
k6 run --out csv=results.csv script.js
# Cloud execution
k6 cloud script.js
# Run with config file
k6 run --config config.json script.js
const BASE_URL = __ENV.BASE_URL || 'https://api.example.com';
const API_KEY = __ENV.API_KEY || 'default-key';
const ENVIRONMENT = __ENV.ENV || 'staging';
export default function() {
const response = http.get(`${BASE_URL}/endpoint`, {
headers: { 'X-API-Key': API_KEY },
});
}
name: Load Test
on:
push:
branches: [main]
schedule:
- cron: '0 2 * * *' # Daily at 2 AM
jobs:
load-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install k6
run: |
curl -L https://github.com/grafana/k6/releases/download/v0.47.0/k6-v0.47.0-linux-amd64.tar.gz | tar xvz
sudo mv k6-v0.47.0-linux-amd64/k6 /usr/local/bin/
- name: Run load test
run: k6 run --env BASE_URL=${{ secrets.API_URL }} tests/load-test.js
- name: Upload results
uses: actions/upload-artifact@v3
with:
name: k6-results
path: results.json
import { textSummary } from 'https://jslib.k6.io/k6-summary/0.0.1/index.js';
// Custom summary handler
export function handleSummary(data) {
return {
'stdout': textSummary(data, { indent: ' ', enableColors: true }),
'summary.json': JSON.stringify(data),
};
}
export default function() {
const response = http.get('https://api.example.com/data');
// Detailed debugging on failure
if (!check(response, { 'status is 200': (r) => r.status === 200 })) {
console.error(`Request failed: ${response.status}`);
console.error(`Response body: ${response.body.substring(0, 500)}`);
console.error(`Request URL: ${response.request.url}`);
}
// Log slow requests
if (response.timings.duration > 1000) {
console.warn(`Slow request: ${response.timings.duration}ms - ${response.request.url}`);
}
}
| Metric | Description | Typical Threshold |
|---|---|---|
http_req_duration | Response time | p(95)<500ms |
http_req_failed | Failed request rate | rate<0.01 |
http_reqs | Requests per second | N/A (informational) |
http_req_waiting | Time to first byte | p(95)<200ms |
vus | Active virtual users |
sleep() между запросамиWeekly Installs
72
Repository
GitHub Stars
3
First Seen
Jan 29, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykFail
Installed on
opencode69
gemini-cli68
github-copilot68
codex68
amp66
kimi-cli66
Skills CLI 使用指南:AI Agent 技能包管理器安装与管理教程
44,900 周安装
Google Ads 账户深度分析与健康度审计工具 - 74项检查,自动生成优化报告
219 周安装
PyHealth医疗健康AI工具包:临床机器学习Python库,支持MIMIC/eICU数据集与预测模型
211 周安装
Phoenix AI 可观测性平台 - 开源 LLM 应用追踪、评估与监控解决方案
208 周安装
Eve任务生命周期管理:从构思到完成的完整工作流与命令行工具
214 周安装
百度网盘文件管理Skill:支持上传下载分享等操作的AI工具
220 周安装
Magento Shell命令执行工具:hyva-exec-shell-cmd - 跨环境命令包装器
215 周安装
| N/A |
iterations | Completed iterations | N/A |