ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

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

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