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 C5AD17C747E3415A3642D57D77C6C491D6AC1D69
echo "deb https://dl.k6.io/deb stable main" | sudo tee /etc/apt/sources.list.d/k6.list
sudo 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 1 生命周期(持续运行) 迭代 1 迭代 2 迭代 3 迭代 4 迭代 5 VU 2 生命周期(持续运行) 迭代 1 迭代 2 迭代 3 迭代 4 每个 VU 独立运行,迭代之间可能有 sleep 或等待时间;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 运行数据流 k6 脚本 (JS) k6 执行引擎 目标系统 (SUT) 指标汇总与输出 终端 / 控制台 JSON / HTML 报告 k6 引擎解析脚本 → 创建 VU → 发送请求到目标系统 → 收集指标 → 输出到终端或报告文件
快速调试: 在开发脚本阶段,可以使用 k6 run --vus 1 --duration 10s script.js 来快速验证脚本逻辑是否正确,避免长时间运行浪费资源。

2.6 本章小结

通过本章回顾,你应该已经掌握了:

  • k6 的安装与验证方法。
  • 基本脚本结构:导入、Options、默认导出函数。
  • VU 与迭代的运行模型:每个 VU 独立串行执行迭代。
  • Options 配置入门:vus、duration、iterations、stages、thresholds。
  • 如何运行脚本并理解输出指标。