2. k6 基础回顾:安装、脚本结构、VU与迭代、Options配置
在进入参数化与容量压测水位设计之前,必须牢固掌握 k6 的核心基础。本章将快速梳理 k6 的安装方式、基本脚本骨架、虚拟用户(VU)与迭代(Iteration)的运行机制,以及 Options 配置的入门写法。这些概念是后续所有复杂场景的基石。
2.1 k6 安装与环境验证
k6 支持主流操作系统,推荐使用包管理器或直接下载二进制文件进行安装。以下为常见安装方式:
| 操作系统 | 安装命令 / 方式 |
|---|---|
| macOS (Homebrew) | brew install k6 |
| Windows (Chocolatey) | choco install k6 |
| Windows (Winget) | winget install k6 |
| Linux (Debian/Ubuntu) | sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69echo "deb https://dl.k6.io/deb stable main" | sudo tee /etc/apt/sources.list.d/k6.listsudo apt-get update && sudo apt-get install k6 |
| Docker | docker pull grafana/k6 |
验证安装: 在终端执行
k6 version,若返回类似 k6 v0.54.0 的版本号,则安装成功。建议保持 k6 为最新稳定版,以获取最新的协议支持和性能优化。
2.2 基本脚本结构
一个标准的 k6 脚本(JavaScript)由三个核心部分组成:导入模块、Options 配置 和 默认导出函数(default export)。以下是一个最小可运行脚本:
import http from 'k6/http';
import { sleep } from 'k6';
export const options = {
vus: 10,
duration: '30s',
};
export default function () {
http.get('https://test.k6.io');
sleep(1);
}
- import:引入 k6 内置模块,如
k6/http(HTTP 请求)、k6(基础函数如 sleep)。 - export const options:定义测试运行时的全局配置,如并发数、持续时间等。
- export default function ():VU 执行的入口函数,每个 VU 会反复执行此函数中的代码,直到测试结束。
关键理解: 脚本中的
export default function 是每个虚拟用户(VU)的“工作单元”。k6 会为每个 VU 独立运行这个函数,函数内的每一步操作(如发送请求、等待)都会计入该 VU 的迭代周期。
2.3 VU 与迭代概念
理解 VU(Virtual User)和迭代(Iteration)是掌握 k6 运行模型的核心。
- VU(虚拟用户):模拟一个真实的用户。每个 VU 拥有独立的 JavaScript 运行时环境(包括全局变量、内存状态)。VU 的数量由
options.vus或--vus参数控制。 - 迭代(Iteration):VU 执行一次
export default function的完整过程。一个 VU 可以在测试持续时间内执行多次迭代。
下图展示了 VU 与迭代在时间轴上的关系:
注意: 默认情况下,每个 VU 的迭代是串行的——即一个迭代完成后,才会开始下一个迭代。如果希望一个 VU 同时发起多个请求(如并发请求),需要在脚本中使用
Promise.all 或 http.batch() 方法。
2.4 Options 配置入门
Options 是 k6 脚本中控制测试行为的核心配置对象。以下是最常用的配置项:
| 配置项 | 类型 | 说明 | 示例 |
|---|---|---|---|
vus |
number | 并发虚拟用户数 | vus: 20 |
duration |
string | 测试总持续时间 | duration: '1m' |
iterations |
number | 总迭代次数(所有 VU 之和) | iterations: 100 |
stages |
array | 分阶段负载递增/递减配置 | stages: [{ duration: '30s', target: 50 }] |
thresholds |
object | 定义通过/失败的条件 | thresholds: { http_req_duration: ['p(95)<500'] } |
ext |
object | 扩展配置,如对接 k6 Cloud 或自定义输出 | ext: { loadimpact: { projectID: 123 } } |
以下是一个包含 stages 和 thresholds 的进阶配置示例:
import http from 'k6/http';
import { check, sleep } from 'k6';
export const options = {
stages: [
{ duration: '2m', target: 50 }, // 2分钟内从0线性增加到50 VU
{ duration: '5m', target: 50 }, // 保持50 VU运行5分钟
{ duration: '2m', target: 0 }, // 2分钟内线性减少到0 VU
],
thresholds: {
http_req_duration: ['p(95)<2000'], // 95%的请求响应时间必须小于2000ms
http_req_failed: ['rate<0.01'], // 失败率必须小于1%
},
};
export default function () {
const res = http.get('https://test.k6.io');
check(res, {
'status is 200': (r) => r.status === 200,
});
sleep(1);
}
容量压测提示: 在容量压测中,
stages 配置是实现“水位口径”的关键。通过分阶段递增 VU 数量,可以观察系统在不同负载水平下的响应时间、吞吐量和错误率变化,从而确定系统的容量拐点。
2.5 运行脚本与查看结果
将上述脚本保存为 script.js,在终端执行以下命令:
k6 run script.js
k6 会在控制台输出实时指标,包括:
- http_req_duration:请求响应时间(平均值、中位数、p90、p95)。
- http_reqs:每秒请求数(吞吐量)。
- vus:当前活跃 VU 数量。
- iterations:已完成的总迭代次数。
- data_received / data_sent:网络流量统计。
下图展示了 k6 运行时的核心数据流与输出关系:
快速调试: 在开发脚本阶段,可以使用
k6 run --vus 1 --duration 10s script.js 来快速验证脚本逻辑是否正确,避免长时间运行浪费资源。
2.6 本章小结
通过本章回顾,你应该已经掌握了:
- k6 的安装与验证方法。
- 基本脚本结构:导入、Options、默认导出函数。
- VU 与迭代的运行模型:每个 VU 独立串行执行迭代。
- Options 配置入门:
vus、duration、iterations、stages、thresholds。 - 如何运行脚本并理解输出指标。