本文目录导读:

这是一个非常实用的问题,k6 是目前最流行的开源性能测试工具之一,核心优势是用 JavaScript 编写脚本、资源占用极低、原生支持 HTTP/1.1、HTTP/2、WebSocket、gRPC。
下面是一份从安装、编写脚本、运行到分析结果的完整指南。
第一步:安装 k6
k6 是一个单文件二进制工具,安装非常简单:
- macOS (Homebrew):
brew install k6
- Windows (Chocolatey / winget):
choco install k6 # 或 winget install k6
- Linux (Debian/Ubuntu):
sudo apt update sudo apt install k6
- Docker:
docker pull grafana/k6
安装后运行 k6 version 确认安装成功。
第二步:编写第一个测试脚本
k6 脚本用 JavaScript 编写,创建一个文件 test.js:
// 1. 引入 k6 内置模块
import http from 'k6/http';
import { sleep, check } from 'k6';
// 2. 可选:配置测试选项(也可以在命令行中指定)
export const options = {
// 虚拟用户数
vus: 10,
// 测试持续时间
duration: '30s',
// 断言阈值:失败率不能超过1%
thresholds: {
http_req_failed: ['rate<0.01'],
http_req_duration: ['p(95)<2000'], // 95%的请求响应时间小于2秒
},
};
// 3. 默认函数 - 每个VU(虚拟用户)循环执行这个函数
export default function () {
// 发送GET请求
const response = http.get('https://httpbin.test.k6.io/get');
// 对响应进行断言检查
check(response, {
'状态码是200': (r) => r.status === 200,
'响应时间 < 1秒': (r) => r.timings.duration < 1000,
});
// 思考时间:模拟用户等待
sleep(1);
}
第三步:运行测试
在终端执行:
k6 run test.js
你会看到实时输出,包括:
- 正在发起的请求数
- 当前请求速率
- 响应时间
- 测试结束后的总结报告(包括请求量、延迟分布、失败率等)
第四步:理解核心概念
-
VU——虚拟用户(Virtual Users):
- 每个 VU 独立执行
default函数。 - 通过
-u或options.vus设置。
- 每个 VU 独立执行
-
阶段(Stages)——更真实的负载模式: 相比固定
vus,用stages可以模拟逐步增加压力:export const options = { stages: [ { duration: '2m', target: 100 }, // 2分钟内从0增加到100个VU { duration: '5m', target: 100 }, // 保持100个VU 5分钟 { duration: '2m', target: 0 }, // 2分钟内逐步降到0,平稳结束 ], }; -
检查(Checks):
用于验证请求是否成功(如状态码、响应内容),不会中断测试,只记录结果。
-
阈值(Thresholds):
- 用于定义测试通过/失败的标准。
'http_req_duration': ['p(95)<2000']表示 95% 的请求必须低于 2 秒。
- 用于定义测试通过/失败的标准。
第五步:进阶使用场景
测试 POST API(登录、提交数据)
import http from 'k6/http';
import { check } from 'k6';
export default function () {
const url = 'https://test-api.com/login';
const payload = JSON.stringify({
email: 'user@example.com',
password: '123456',
});
const params = {
headers: {
'Content-Type': 'application/json',
},
};
const res = http.post(url, payload, params);
check(res, { '登录成功': (r) => r.status === 200 });
}
动态数据与参数化
避免多个虚拟用户使用相同数据导致缓存命中或冲突:
import { SharedArray } from 'k6/data'; // 共享数据,节省内存
import { randomItem } from 'https://jslib.k6.io/k6-utils/1.2.0/index.js';
// 从文件加载数据
const userList = new SharedArray('users', function () {
return JSON.parse(open('./users.json')).users;
});
export default function () {
const user = randomItem(userList);
// 使用 user.username, user.password 发起请求
}
使用浏览器(真实浏览器交互)
k6 也有浏览器测试能力(k6 browser),但这不是它的核心场景,如果必须测试前端SPA(单页应用)的渲染,可以考虑,但纯后端API/接口测试是k6的绝对强项。
第六步:分析报告
运行 k6 run 后,终端会输出类似这样的报告:
data_received...........: 1.2 GB 40 MB/s
data_sent...............: 80 MB 2.7 MB/s
http_req_blocked........: avg=1.2ms min=0s med=0s ...
http_req_connecting.....: avg=1.1ms min=0s med=0s ...
http_req_duration.......: avg=124ms min=10ms med=95ms max=2.3s
{ expected_response:true }........: avg=124ms ... ...
http_req_failed.........: 0.02% ✓ 2 ✗ 9980
http_req_receiving......: avg=0.3ms ...
http_req_sending........: avg=0.2ms ...
http_req_tls_handshaking: avg=1.1ms ...
http_req_waiting........: avg=122ms ...
http_reqs...............: 10000 333.33/s
iteration_duration......: avg=1.12s ...
iterations..............: 10000 333.33/s
vus.....................: 10 min=10 max=100
vus_max.................: 100
重点看这几个指标:
http_req_duration:平均/中位数/P95/P99 响应时间,这是最重要的指标。http_req_failed:请求失败率。http_reqs:总请求数和每秒请求数(RPS,Requests Per Second)——衡量系统吞吐量。
第七步:最佳实践与常见误区
| ✅ 正确做法 | ❌ 错误做法 |
|---|---|
| 从 1个VU 开始,逐步增加 | 一上来就跑 1000 VU |
| 使用 stages 模拟爬坡(ramp-up) | 固定 VU 数直接冲击 |
| 使用 check 验证正确性 | 只看响应时间,不看是否正确返回 |
| 各 VU 之间数据隔离(参数化) | 所有 VU 用同一个用户名/数据 |
| 测试时间至少 3-5分钟 以上 | 只跑几十秒(系统缓存可能还没生效) |
| 监控服务端指标(CPU/内存/DB)配合 | 只看 k6 客户端报告 |
k6 适合做什么?
- API 接口性能测试(最优场景)
- 压力测试(找出系统最大承载能力)
- 负载测试(验证系统在预期负载下的表现)
- 冒烟测试(低负载快速验证系统是否存活)
不适合: 非常复杂的浏览器端交互性能测试(这种情况推荐 Playwright + 自建指标,或使用专有工具 LoadRunner)。