k6简介:为何选择它
k6由Go语言编写,相较于传统工具JMeter,具有轻量高效、语法简洁、扩展性强等优势。其特点包括:
- 开发者友好:基于JavaScript/TypeScript脚本,无缝衔接现代开发流程
- 云原生支持:内置分布式测试能力,轻松模拟万级并发
- 丰富可视化:提供HTML/JSON格式报告,支持自定义仪表板
- 扩展生态:通过npm插件体系,可集成Prometheus、InfluxDB等监控工具
安装指南
方式1:直接下载二进制包
- 访问官方下载页
- 根据系统选择对应版本:
# macOS curl -sSL https://k6.io/install.sh | sudo bash # Linux wget https://github.com/grafana/k6/releases/download/v0.43.0/k6-v0.43.0-linux-amd64.tar.gz tar xvfz k6-*.tar.gz sudo mv k6-*/k6 /usr/local/bin/ # Windows # 下载exe文件后添加至系统PATH
方式2:通过包管理器安装
# 使用npm(Node.js包管理器)
npm install -g k6
# Chocolatey(Windows)
choco install k6
验证安装
k6 version
# 应输出类似:k6 v0.43.0 (2023-04-15T08:20:00Z)
使用场景与脚本编写
场景1:基础HTTP压测
import http from 'k6/http';
import { sleep } from 'k6';
export const options = {
stages: [
{ duration: '30s', target: 10 }, // 30秒内逐步增加到10个虚拟用户
{ duration: '1m', target: 10 }, // 保持10用户持续1分钟
{ duration: '20s', target: 0 }, // 20秒内逐步减少到0用户
],
};
export default function () {
const res = http.get('https://test-api.com/endpoint');
sleep(1); // 模拟用户思考时间
}
场景2:WebSocket测试
import ws from 'k6/ws';
export default function () {
const url = 'wss://echo.websocket.org';
const params = { tags: { my_tag: 'value' } };
const wsConn = ws.connect(url, params, function (socket) {
socket.on('open', function () {
socket.send(JSON.stringify({ action: 'test' }));
});
socket.on('message', function (data) {
console.log('Received:', data);
socket.close();
});
});
wsConn.close();
}
场景3:自定义指标监控
import { Trend } from 'k6/metrics';
const errorRate = new Trend('errors');
export function handleSummary(data) {
// 自定义摘要报告
console.log(`\nCustom Report:
Total Requests: ${data.counters.requests.total}
Errors: ${errorRate.count}`);
}
export default function () {
const res = http.get('https://api.com');
if (res.status !== 200) {
errorRate.add(1);
}
}
高级功能
分布式测试
# 启动主节点
k6 run --out json=distributed.json script.js
# 在其他机器启动从节点
k6 run --out json=distributed.json --tag distributed script.js
集成监控体系
import { Counter, Gauge } from 'k6/metrics';
// 自定义指标
const customCounter = new Counter('custom_metric');
const activeUsers = new Gauge('vus');
export function handleSummary(data) {
// 发送指标到InfluxDB
sendInfluxMetrics(data);
}
export default function (data) {
activeUsers.add(1);
// ...测试逻辑
activeUsers.add(-1);
}
// 通过插件实现InfluxDB集成
function sendInfluxMetrics(data) {
const influx = require('k6-influx');
influx.sendMetrics(data);
}
生成可视化报告
k6 run --out influxdb=http://localhost:8086/write?db=k6 script.js