2. k6 基础回顾:k6 安装、k6 脚本结构、VU 与迭代概念、options 配置入门
在深入自定义检查点与容量压测水位口径之前,必须夯实 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 install k6 (需添加官方仓库) |
| Docker | docker pull grafana/k6 |
安装完成后,在终端执行 k6 version 验证是否成功。若返回版本号(如 k6 v0.50.0),则环境准备就绪。
💡 提示: 对于团队协作或 CI/CD 场景,推荐使用 Docker 方式运行 k6,以确保环境一致性,避免因本地依赖差异导致的测试结果偏差。
2.2 k6 脚本结构:从入口到导出
一个标准的 k6 脚本(通常以 .js 为后缀)遵循模块化设计,核心由三个部分组成:导入模块、默认导出函数(default export) 以及 可选的 options 配置。以下是一个最小化但完整的脚本示例:
// 1. 导入 k6 内置模块
import http from 'k6/http';
import { check, sleep } from 'k6';
// 2. 定义测试配置(可选,但推荐)
export let options = {
vus: 10,
duration: '30s',
};
// 3. 默认导出函数 —— 每个 VU 循环执行的代码
export default function () {
let res = http.get('https://test.k6.io');
check(res, {
'status is 200': (r) => r.status === 200,
});
sleep(1);
}
脚本执行流程如下:
- 导入阶段:加载
k6/http用于发起 HTTP 请求,k6核心模块提供check、sleep等工具函数。 - 配置阶段:
options对象定义测试负载参数,如并发 VU 数、运行时长。 - 执行阶段:k6 根据
options创建指定数量的 VU,每个 VU 反复执行export default function中的代码,直到测试结束。
📌 关键点:
export default function 是每个 VU 的“工作单元”,所有业务逻辑(请求、检查、等待)都应写在此函数内。k6 不识别 module.exports 或具名导出作为入口函数。
2.3 VU 与迭代:理解并发与循环
VU(Virtual User,虚拟用户)和迭代(Iteration)是 k6 负载模型的两大基石。理解它们的区别与关系,是设计压测场景的前提。
| 概念 | 定义 | 类比 |
|---|---|---|
| VU(虚拟用户) | 一个独立的、并发的 JavaScript 运行时环境。每个 VU 拥有独立的上下文(如全局变量、Cookie jar)。 | 相当于一个真实的浏览器用户,同时在线操作。 |
| 迭代(Iteration) | 每个 VU 执行一次 export default function 的完整过程。 |
相当于用户完成一次“浏览-操作-离开”的会话。 |
VU 与迭代的协作关系可以通过以下 SVG 流程图直观展示:
⚠️ 常见误区: 不要将 VU 数量等同于并发请求数。一个 VU 在一次迭代中可以发送多个请求(如页面加载 + API 调用),真正的并发请求量 = VU 数 × 每个迭代中的请求数。在容量压测中,应关注的是 请求吞吐量(RPS) 而非单纯的 VU 数量。
2.4 options 配置入门:控制负载与行为
options 是 k6 脚本中用于声明测试参数的全局对象。它支持多种配置项,从基础的并发控制到高级的阈值设定。以下是最常用的入门级配置:
| 配置项 | 类型 | 说明 | 示例 |
|---|---|---|---|
vus |
number | 并发虚拟用户数 | vus: 20 |
duration |
string | 测试持续时长(恒定 VU 模式) | duration: '1m' |
iterations |
number | 总迭代次数(所有 VU 共享) | iterations: 100 |
stages |
array | 阶段式负载递增/递减 | stages: [{duration: '30s', target: 50}] |
thresholds |
object | 定义通过/失败的条件 | thresholds: { http_req_duration: ['p(95)<500'] } |
以下是一个使用 stages 进行阶梯式加压的配置示例,这在容量压测中非常实用:
export let options = {
stages: [
{ duration: '2m', target: 50 }, // 前 2 分钟,从 0 线性增加到 50 VU
{ duration: '5m', target: 50 }, // 保持 50 VU 运行 5 分钟
{ duration: '2m', target: 100 }, // 2 分钟内增加到 100 VU
{ duration: '5m', target: 100 }, // 保持 100 VU 运行 5 分钟
{ duration: '1m', target: 0 }, // 1 分钟内降至 0 VU,优雅结束
],
};
配置项的执行优先级遵循以下规则:
- 若同时指定
duration和iterations,k6 会优先使用iterations,并在达到总迭代次数后停止,忽略duration。 stages与vus/duration互斥,使用stages时不应再设置vus和duration。- 阈值(thresholds)在测试结束后统一评估,不会中断正在运行的测试。
💡 最佳实践: 在容量压测的“水位口径”测试中,推荐使用
stages 模式。它能够平滑地增加负载,帮助你观察系统在不同并发量下的响应时间变化,从而更准确地定位性能拐点(即“水位线”)。