“像写单元测试一样写性能测试”——k6 完整入门指南

一、k6 是什么

k6 使用 Go 语言构建,但通过内嵌的 JavaScript 引擎(Sobek,Goja 的分支)暴露 JS 脚本 API,兼具 Go 的高性能与 JavaScript 的易用性。它的核心特性包括:可配置的负载生成、测试即代码、全功能脚本 API、内嵌 JS 引擎、多协议支持、庞大的扩展生态、灵活的指标存储与可视化,以及与 Grafana Cloud 的原生集成。

AGENTS.md 中对项目的描述也印证了这一点:k6 是用 Go 构建的现代负载测试工具,允许开发者编写 JavaScript 测试脚本模拟用户行为并测量系统性能,支持可配置负载生成、多协议(HTTP、WebSocket、gRPC、浏览器)以及灵活的指标输出。

二、 安装 k6

k6 提供多种分发渠道:

  • 二进制/包管理器:README 的 https://grafana.com/docs/k6/latest/ 链接是官方安装文档入口,涵盖各平台安装方式。
  • Docker 镜像 :k6 官方维护了两种镜像 ------ 精简版 release 和内置 Chromium 的 with-browser,可以直接 docker run grafana/k6 run script.js 使用。其 Dockerfile 基于 Debian 镜像构建,通过 entrypoint.sh 脚本启动
  • Linux 包 :k6 也支持通过 APT/YUM 仓库安装 .deb/.rpm 包,相关打包与发布脚本可参考 packaging/ 目录

三、快速上手:第一个 k6 脚本

一个最简单的 k6 测试脚本长这样:

js 复制代码
import http from "k6/http";
import { check, sleep } from "k6";

export const options = {
  thresholds: {
    http_req_duration: ["p(99) < 3000"],
  },
  stages: [
    { duration: "30s", target: 15 },
    { duration: "1m", target: 15 },
    { duration: "20s", target: 0 },
  ],
};

export default function () {
  let res = http.get("https://quickpizza.grafana.com");
  check(res, { "status was 200": (r) => r.status == 200 });
  sleep(1);
}

这段脚本来自官方 README 示例,包含了 k6 最核心的三个概念:

  • options :配置负载模型(stages 定义虚拟用户数随时间的变化)和通过/失败判定标准(thresholds)。
  • default 函数:每个虚拟用户(VU)每次迭代都会执行的入口函数。
  • check():对响应结果做断言,不会中断测试执行,但会记录成功/失败指标。

写好脚本后,直接在命令行运行 k6 run script.js 即可,支持本地 CLI、CI 流水线,甚至 Kubernetes 集群上执行。如果不想写代码,Grafana 还提供了桌面应用 k6 Studio,可以直接生成 k6 脚本。

四、协议支持:不仅仅是 HTTP

k6 支持多种协议模块,可通过 import 语句直接调用:

协议 说明
HTTP/1.1、HTTP/2 全功能 HTTP 客户端,支持批量请求、认证、压缩等
WebSocket 基于事件的 WebSocket 连接
gRPC 支持反射的 gRPC 客户端
浏览器(Browser) 基于 Chrome DevTools Protocol 的浏览器自动化

以 gRPC 为例,k6 提供了 grpc.Client,可以像下面这样调用服务:

javascript 复制代码
import grpc from 'k6/grpc';

const client = new grpc.Client();
client.connect('grpc.test.k6.io:443');
const overallResponse = client.healthCheck();
client.close();

这个 client.healthCheck() 方法在 v1.2.0/v1.2.1 版本引入,用来简化 gRPC 服务的健康检查,免去手动调用 invoke 的样板代码。同版本还改进了 gRPC 对 NaNInfinity 浮点值的处理,统一使用字符串表示以对齐其他 gRPC API。

浏览器自动化则是另一大亮点,k6 官方脚手架模板展示了典型用法:通过 scenarios 配置 browser: { type: "chromium" },再用 browser.newPage()page.goto()page.locator()page.screenshot() 等 API 完成端到端浏览器测试。根据最新代码,浏览器模块还支持通过 connectOverCDP 连接到已有浏览器实例进行调试。

五、负载模型:场景(Scenarios)与阶段(Stages)

除了简单的 stages 递增/递减虚拟用户数外,k6 还支持更精细的 scenarios 配置,可以为不同的执行器(executor)分别设置 VU 数、迭代次数等参数,例如浏览器测试模板中用的 shared-iterations 执行器。官方模板中的 HTTP 协议脚本也展示了典型的 stages + thresholds 组合用法,配合 http_req_failedhttp_req_duration 阈值判定测试是否通过。

setup() 函数常用于测试开始前的准备工作,例如检查目标服务是否可用,若不可用则调用 exec.test.abort() 直接终止测试。

六、扩展生态:xk6 与自动扩展解析

k6 的一大亮点是它庞大的扩展生态。核心之外的协议或功能可以通过 xk6 构建体系添加,允许 Go 开发者在不修改 k6 核心代码的情况下扩展新协议、输出方式或 JS API。

v1.2.0/v1.2.1 版本引入了 自动扩展解析(Automatic Extension Resolution) 功能(原名 Binary Provisioning),默认开启,能自动检测脚本中 import 的扩展并自动配置正确的 k6 二进制文件,无需再手动编译自定义二进制:

javascript 复制代码
import faker from "k6/x/faker";

export default function () {
  console.log(faker.person.firstName());
}

以前只支持官方扩展,后来通过设置 K6_ENABLE_COMMUNITY_EXTENSIONS=true 环境变量,还能使用社区扩展列表中的任意扩展。不过需要注意,社区扩展仅支持本地执行(k6 runk6 cloud run --local-execution),Grafana Cloud k6 上运行测试时只允许官方扩展。

七、断言库(Assertions Library)

v1.2.1 版本预览发布了全新的断言库 ,提供 expect() 函数及一系列表达力强的匹配器(matcher),API 设计借鉴自 Playwright 的断言语法,支持链式调用,同时适用于 HTTP/API 协议测试和浏览器测试场景。

八、指标与可观测性

k6 在测试执行期间会收集详细的指标数据,并支持多种输出后端,包括 JSON 文件、InfluxDB、Prometheus 以及原生集成的 Grafana Cloud SaaS 方案,用于测试执行、指标关联和数据分析。测试报告中包含丰富的内建指标,例如 http_req_duration(请求耗时,含 p90/p95 百分位)、http_req_failed(失败率)、iterations(迭代次数)、vus(虚拟用户数)等,可以直观展示压测结果的各项统计。

九、Cloud 集成与最新亮点

v1.6.0 版本为 Cloud 命令新增了可配置的默认 Grafana Cloud stack 支持,免去每次运行都要指定 project id 的麻烦,可以通过 stackID 选项或 K6_CLOUD_STACK_ID 环境变量指定使用哪个 stack:

bash 复制代码
k6 cloud login --token $MY_TOKEN --stack my-stack-slug
k6 cloud run script.js

同一版本还引入了全新的 k6 deps 命令,用于分析并列出脚本或归档文件的所有依赖,特别适合在使用自动扩展解析时了解需要哪些扩展来构建自定义二进制。该命令支持以 JSON 格式输出依赖列表 ,方便程序化处理。此外 v1.6.0 还带来了浏览器 API 的增强(frameLocator()goBack()goForward())、Crypto 模块的 PBKDF2 支持、jslib 新增的 TOTP 库,以及面向 AI 辅助脚本编写的 mcp-k6 MCP 服务器。


相关推荐
小小龙学IT4 小时前
Google Test(gtest/gmock)开源 C++ 单元测试与 Mock 框架完全指南
c++·单元测试·开源
努力搬砖的咸鱼1 天前
意图理解:让Agent从需求描述自动生成Pytest测试策略
人工智能·python·ai·单元测试·pytest·agent
IPdodo_3 天前
Python 爬虫网络质量评估实战:成功率、P95 延迟与错误分布怎么测
网络·爬虫·python·网络协议·性能测试
AI领路人.4 天前
[特殊字符] 用 OpenClaw 实现一个 C++ 复刻版 QuantClaw
websocket·单元测试·discord·rest api·内存占用·c++17
神奇小梵5 天前
《javaweb基础》后端篇————maven补充(用maven单元测试,maven常见问题)
单元测试·maven
lsz1525906 天前
数据库系统测试方案中测试用例原则
测试用例·性能测试·软件开发·数据库设计·测试原则
AmyLin_20019 天前
AI 如何做出数学发现【5】- AI 数学证明怎样做单元测试:从“看起来顺”到可否证工作流
人工智能·单元测试·openai·数学推理·符号计算·ai推理·反例生成
是小艺吗。10 天前
第三方机构出具的软件功能测试报告的作用与流程说明,中承信安专业讲解
功能测试·单元测试·软件测试报告·软件功能测试·软件测评