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

发布时间:2026/10/7 21:02:30

“像写单元测试一样写性能测试”——k6 完整入门指南 一、k6 是什么k6 使用 Go 语言构建但通过内嵌的 JavaScript 引擎SobekGoja 的分支暴露 JS 脚本 API兼具 Go 的高性能与 JavaScript 的易用性。它的核心特性包括可配置的负载生成、测试即代码、全功能脚本 API、内嵌 JS 引擎、多协议支持、庞大的扩展生态、灵活的指标存储与可视化以及与 Grafana Cloud 的原生集成。AGENTS.md 中对项目的描述也印证了这一点k6 是用 Go 构建的现代负载测试工具允许开发者编写 JavaScript 测试脚本模拟用户行为并测量系统性能支持可配置负载生成、多协议HTTP、WebSocket、gRPC、浏览器以及灵活的指标输出。二、 安装 k6k6 提供多种分发渠道二进制/包管理器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 测试脚本长这样importhttpfromk6/http;import{check,sleep}fromk6;exportconstoptions{thresholds:{http_req_duration:[p(99) 3000],},stages:[{duration:30s,target:15},{duration:1m,target:15},{duration:20s,target:0},],};exportdefaultfunction(){letreshttp.get(https://quickpizza.grafana.com);check(res,{status was 200:(r)r.status200});sleep(1);}这段脚本来自官方 README 示例包含了 k6 最核心的三个概念options配置负载模型stages定义虚拟用户数随时间的变化和通过/失败判定标准thresholds。default函数每个虚拟用户VU每次迭代都会执行的入口函数。check()对响应结果做断言不会中断测试执行但会记录成功/失败指标。写好脚本后直接在命令行运行k6 run script.js即可支持本地 CLI、CI 流水线甚至 Kubernetes 集群上执行。如果不想写代码Grafana 还提供了桌面应用 k6 Studio可以直接生成 k6 脚本。四、协议支持不仅仅是 HTTPk6 支持多种协议模块可通过import语句直接调用协议说明HTTP/1.1、HTTP/2全功能 HTTP 客户端支持批量请求、认证、压缩等WebSocket基于事件的 WebSocket 连接gRPC支持反射的 gRPC 客户端浏览器Browser基于 Chrome DevTools Protocol 的浏览器自动化以 gRPC 为例k6 提供了grpc.Client可以像下面这样调用服务importgrpcfromk6/grpc;constclientnewgrpc.Client();client.connect(grpc.test.k6.io:443);constoverallResponseclient.healthCheck();client.close();这个client.healthCheck()方法在v1.2.0/v1.2.1版本引入用来简化 gRPC 服务的健康检查免去手动调用invoke的样板代码。同版本还改进了 gRPC 对NaN、Infinity浮点值的处理统一使用字符串表示以对齐其他 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 协议脚本也展示了典型的stagesthresholds组合用法配合http_req_failed和http_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 二进制文件无需再手动编译自定义二进制importfakerfromk6/x/faker;exportdefaultfunction(){console.log(faker.person.firstName());}以前只支持官方扩展后来通过设置K6_ENABLE_COMMUNITY_EXTENSIONStrue环境变量还能使用社区扩展列表中的任意扩展。不过需要注意社区扩展仅支持本地执行k6 run或k6 cloud run --local-executionGrafana Cloud k6 上运行测试时只允许官方扩展。七、断言库Assertions Libraryv1.2.1版本预览发布了全新的断言库提供expect()函数及一系列表达力强的匹配器matcherAPI 设计借鉴自 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环境变量指定使用哪个 stackk6 cloud login--token$MY_TOKEN--stackmy-stack-slug k6 cloud run script.js同一版本还引入了全新的k6 deps命令用于分析并列出脚本或归档文件的所有依赖特别适合在使用自动扩展解析时了解需要哪些扩展来构建自定义二进制。该命令支持以 JSON 格式输出依赖列表方便程序化处理。此外v1.6.0还带来了浏览器 API 的增强frameLocator()、goBack()、goForward()、Crypto 模块的 PBKDF2 支持、jslib 新增的 TOTP 库以及面向 AI 辅助脚本编写的mcp-k6MCP 服务器。
延伸阅读

更多相关文章

2026/10/7 21:03:02

从零到一搭建家庭游戏串流服务器:Sunshine保姆级上手手记

从零到一搭建家庭游戏串流服务器:Sunshine保姆级上手手记 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 这个烦恼,是不是也困扰着你 事情要从一个加班的深…

2026/10/8 15:46:41

Python列表与元组:可变性、性能与应用场景详解

前段时间在技术社区闲逛,看到一个提问:“Python里列表和元组到底有啥区别?我该用哪个?”下面回答区的留言五花八门,但也不少把两者混为一谈的。这个问题看似基础,但真要动手写代码时,不少人还是…

2026/10/8 15:46:41

三数之和双指针解法:去重细节与算法复杂度优化

刷题刷到 LeetCode 15 题“三数之和”,这个位置非常微妙。前十几题基本是数组、字符串、动态规划热身,而这一题一出来,很多人的思维会卡住。题目本身不复杂:给定一个整数数组,找出所有和为 0 且不重复的三元组。但“不…

2026/10/8 15:46:41

Java电商源码改造实战:从跑通到上线的表设计、支付与压测

简介:基于Java技术栈构建的完整电商网站源码项目,面向正在学习Spring Boot、MyBatis、Redis等后端框架,或希望掌握Vue.js/jQuery前端交互的开发者,也适合需要参考实际业务流程的初、中级程序员。项目覆盖用户注册登录、商品分类搜…

2026/10/8 15:46:41

软件测试核心知识全解析:流程、实战、工具与面试攻略

这些年我见过太多人把软件测试理解成“找个人点点按钮”,也见过太多项目因为测试缺位在上线后炸出惊天大雷。软件测试这门活,表面上是执行用例、提bug,内核却是质量建模、风险判断、流程管理,甚至项目管理的全面较量。 这篇文章我…

2026/10/8 15:41:39

隔离内网AI Agent工程实战:本地模型推理与RAG知识库构建

1. 项目背景与整体架构思路1.1 为什么要在内网环境里跑AI Agent接手"隔离内网下AI Agent工程实战"这个项目,是因为一个很现实的问题:很多企业和机构的生产环境物理隔离,终端、业务系统和核心数据都在一个与公网物理断开的独立网络里…

2026/10/8 10:03:18

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/8 10:03:20

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/8 6:05:44

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 0:02:17

自然数立方等于连续奇数之和:从证明到编程验证

十几年来我一直游走在数学科普和编程教学这两块内容之间,对“看起来像魔法、拆开全是数学”的结论总是格外敏感。最近翻资料时又撞见一句话:任何一个自然数 m 的立方,都可以写成 m 个连续奇数之和。2 的立方等于 3 加 5,3 的立方等…

2026/10/8 0:02:17

C#上位机SSH连接实战:用SSH.NET补齐超时、批量与密钥认证

简介:这是一份基于 C# 开发的 SSH 连接功能半成品工程,原本作为另一个主项目的子功能模块,现独立打包分享。工程采用 WinForms 界面,包含源码、解决方案、安装部署工程、NuGet 依赖包及说明文档,适合正在做远程连接、网…

2026/10/8 0:02:17

Java SpringBoot一体化智能售后系统设计与实现全解析

毕业设计年年做,Java Web 方向的题目翻来覆去就那么几个,但“一体化智能售后系统”这个题,每次看到我都觉得值得认真聊一聊。它不是一个简单 curd 堆出来的管理系统,而是把客户、工单、派单、处理、回访、统计整条链路串起来的一套…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑