“像写单元测试一样写性能测试”——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 服务器。


相关推荐
bdy_y915 小时前
推理引擎测试指南:像调校赛车一样测试AI引擎
人工智能·大模型·性能测试
梁辰兴2 天前
软件工程:单元测试
单元测试·软件工程·梁辰兴·‘设计原则·方法技术·tdd驱动·mock隔离
岁月失语唯石能言5 天前
《 Web项目测试实战:博客系统的功能/接口/自动化/性能全流程测试报告》
自动化测试·功能测试·selenium·jmeter·接口测试·压力测试·性能测试
2601_962299885 天前
python脚本如何单元测试
python·单元测试·pytest·unittest·mock对象
蒸鱼Yuzheng5 天前
游戏画质档位怎么测:配置生效、重启持久化、降级与性能收益
性能测试·游戏测试·画质测试·渲染测试·图形设置
IPdodo_6 天前
静态 IP 访问异常排查:403/429 归因与迁移验收
服务器·网络·数据库·python·网络协议·php·性能测试
牛油果子哥q6 天前
C++大型项目工程精讲:CMake完整实战、静态库&动态库、模块化拆分、单元测试、gdb调试、性能工具、工程踩坑全解
开发语言·c++·单元测试
leoZ2317 天前
AI+前端提效-09 AI赋能前端测试:单元测试、E2E测试自动生成,提升覆盖率
前端·人工智能·opencv·目标检测·数据挖掘·单元测试·语音识别
边吃番茄边敲代码11 天前
从本地工具到 MCP:给 Agent 接入独立工具服务,并补齐自动化测试
人工智能·python·功能测试·ai·单元测试·pytest
qq_4523962311 天前
第十三篇:《测试策略:单元测试、组件测试、E2E 测试的落地实践》
单元测试