
k6 v0.44.0 版本解析Web Crypto 加密模块、浏览器模块破坏性变更与内存优化实践【免费下载链接】k6A modern load testing tool, using Go and JavaScript项目地址: https://gitcode.com/GitHub_Trending/k6/k6k6 v0.44.0 是该版本中承上启下的一个重要发布它引入了部分实现 Web Crypto API 规范的k6/experimental/webcrypto模块为实验性 tracing 模块增加了采样能力通过改进的 per-VU 缓冲池显著降低了内存占用同时k6/experimental/browser模块也集中落地了一批破坏性变更如locator.click异步化、Chrome 沙箱默认启用。读完本文你可以掌握该版本各新特性的用法与迁移要点并能结合当前仓库中的源码internal/js/modules/k6/webcrypto、lib/buffer_pool.go、errext/exitcodes/codes.go等验证这些功能的实现细节。版本总览v0.44.0 的发布内容可以归纳为四条主线新模块k6/experimental/webcrypto部分实现 Web Crypto API 规范新能力实验性 tracing 模块支持采样率配置内存优化改进的 per-VU 缓冲池部分场景下内存占用可降低约 50%官方 issue 中给出的实测数据浏览器模块locator.click异步化、browserContext.addCookies、browserType.Connect、Web Vitals 原生指标等。由于 browser 模块当时仍处于experimental阶段官方明确表示会持续改进 API 以使其更易用因此该模块中的破坏性变更是预期行为。破坏性变更Breaking changeslocator.click改为异步xk6-browser#790 将locator.click转换为异步实现以与page.click、elementHandle.click保持特性对齐。当点击行为会触发导航时必须配合Promise.all与page.waitForNavigation()使用。不触发导航的点击const tails page.locator(input[valueBet on tails!]); await tails.click();触发导航的点击const tails page.locator(input[valueBet on tails!]); await Promise.all([ page.waitForNavigation(), tails.click(), ]);这一模式在当前仓库的 浏览器示例 目录中仍可看到大量使用page.locator配合异步 API 的用法。默认移除--no-sandbox启动参数xk6-browser#817 从 Chrome 默认启动参数中移除了--no-sandboxChrome 将带沙箱启动这是更安全的运行方式。以root用户运行测试时除非显式传入--no-sandbox否则浏览器将无法启动。仍可通过chromium.launch的args参数恢复旧行为const browser chromium.launch({ args: [no-sandbox], });其他移除项xk6-browser#844移除了 browser 模块根模块导出的version参数。用户应改为引用 k6 本体的版本而非 browser 模块的版本xk6-browser#838移除了 First Meaningful PaintFMP指标。该指标的定义依赖各浏览器的私有实现细节且正在被整个行业废弃新的 Web Vitals 指标提供了更可靠的行业标准化前端性能度量详见下文xk6-browser#843移除了 GitHub Actions 中的独立构建步骤。自该版本起不再单独构建并发布 browser 二进制browser 模块只随 k6 主仓库的二进制一起发布。新特性新模块k6/experimental/webcrypto该模块部分实现了 Web Crypto API 规范让 k6 脚本可以直接进行密钥生成、加解密、摘要、签名与验签等密码学操作。下面的示例演示了使用 AES-CBC 算法对 Hello, World! 字符串的加密与解密import { crypto } from k6/experimental/webcrypto; export default async function () { const key await crypto.subtle.generateKey( { name: AES-CBC, length: 256, }, true, [encrypt, decrypt] ); const encoded stringToArrayBuffer(Hello, World!); const iv crypto.getRandomValues(new Uint8Array(16)); const ciphertext await crypto.subtle.encrypt( { name: AES-CBC, iv: iv, }, key, encoded ); const plaintext await crypto.subtle.decrypt( { name: AES-CBC, iv: iv, }, key, ciphertext ); console.log( deciphered text original text: , arrayBufferToHex(plaintext) arrayBufferToHex(encoded) ); } function arrayBufferToHex(buffer) { return [...new Uint8Array(buffer)].map((x) x.toString(16).padStart(2, 0)).join(); } function stringToArrayBuffer(str) { var buf new ArrayBuffer(str.length * 2); // 2 bytes for each char var bufView new Uint16Array(buf); for (var i 0, strLen str.length; i strLen; i) { bufView[i] str.charCodeAt(i); } return buf; }源码印证在当前仓库中该模块位于 internal/js/modules/k6/webcrypto/module.go。从源码结构看模块导出遵循 k6 的标准模块模型RootModule为每个 VU 创建独立的ModuleInstance命名导出为crypto其下挂有getRandomValues、randomUUID以及subtle子对象含decrypt、deriveBits、deriveKey、digest、encrypt、exportKey、generateKey、importKey、sign、unwrapKey、verify、wrapKey等方法并通过DefineDataProperty设置为只读属性。同目录下的 aes.go、rsa.go、pbkdf2.go、hmac.go 等文件按算法拆分实现与规范中的算法分类一致。当前仓库中该模块的完整示例集位于 examples/webcrypto/覆盖digest、getRandomValues、randomUUID、generateKey、import/export、sign/verify、encrypt/decrypt、derive_key、derive_bits等场景且由 cmd_run_test.go 以k6 run方式回归验证。值得注意的是从 internal/js/jsmodules.go 的源码可以看到k6/experimental/webcrypto这一实验性导入路径在后续版本已被移除模块已转正为全局可用SetupGlobally会把crypto对象挂到全局见 bundle.go——这也解释了为什么现在直接import { crypto } from k6/experimental/webcrypto会收到升级提示。tracing 模块的采样能力该版本为实验性 tracing 模块增加了采样能力可以在初始化 Client 时通过sampling选项指定采样率也可以在tracing.InstrumentHTTP函数中单独指定。适用前提说明这是一个实验性experimental特性。在当前仓库中检索InstrumentHTTP等标识符仅能在本文所依据的发布说明中找到说明该实验性模块在此后的版本迭代中已从主代码库移除上述用法仅对 v0.44.x 及相近版本有效。browserContext.addCookiesCookie 现在可以添加到BrowserContext中由该上下文创建的所有新Page都会携带这些 Cookieconst context browser.newContext(); context.addCookies([{ name: myCookie, value: hello world, url: https://test.k6.io }]); const page context.newPage();browserType.Connect连接已运行的浏览器实例在资源受限或需要自行管理浏览器生命周期的场景中用户可能希望连接到一个已经启动的远端浏览器实例。该特性允许 k6 连接手动启动的 Chrome/Chromium 实例只需把browser.launch替换为browser.connect并以 CDP 地址作为第一个参数传入。由于浏览器实例在connect之前必须已经启动launch的部分选项对connect不生效同时既然用户接管了浏览器的启动browser.close在使用browser.connect时被实现为 NOOP需要用户自行关闭浏览器。const browser chromium.connect(ws://127.0.0.1:1234/devtools/browser/e3bb7e53-ad0f-46f3-ae89-a8416868f4ce); const page browser.newPage();配套的 xk6-browser#848 进一步允许多个 k6 实例同时连接同一个浏览器以执行并发测试这是此前不具备的高并发浏览器测试能力。当前仓库中 examples/browser/remote.js 即演示了该远程连接用法。Web Vitals 原生支持Web Vitals 是业界衡量前端性能的通行标准核心指标包括最大内容绘制LCP, Largest Contentful Paint首次输入延迟FID, First Input Delay累计布局偏移CLS, Cumulative Layout Shift自 v0.44.0 起这些指标由 browser 模块自动计算无需任何额外配置。照常运行测试输出中即可看到新指标。以官方示例脚本fillform.js的运行结果为例webvital_cumulative_layout_shift..........: avg0 min0 med0 max0 p(90)0 p(95)0 webvital_cumulative_layout_shift_good.....: 1 0.323332/s webvital_first_contentful_paint...........: avg278.86ms min141.1ms med229.39ms max466.1ms p(90)418.76ms p(95)442.43ms webvital_first_contentful_paint_good......: 3 0.969995/s webvital_first_input_delay................: avg300µs min200µs med300µs max399.99µs p(90)379.99µs p(95)389.99µs webvital_first_input_delay_good...........: 2 0.646663/s webvital_interaction_to_next_paint........: avg16ms min16ms med16ms max16ms p(90)16ms p(95)16ms webvital_interaction_to_next_paint_good...: 1 0.323332/s webvital_largest_content_paint............: avg303.6ms min141.1ms med303.6ms max466.1ms p(90)433.6ms p(95)449.85ms webvital_largest_content_paint_good.......: 2 0.646663/s webvital_time_to_first_byte...............: avg205.23ms min104.79ms med188.39ms max322.5ms p(90)295.67ms p(95)309.08ms webvital_time_to_first_byte_good..........: 3 0.969995/s底层基于 Google 的 web-vitals JS 库采集因此还保留了webvital_interaction_to_next_paint等扩展指标供实验使用。迁移提示summary 中不再出现browser_first_contentful_paint请改用webvital_first_contentful_paint。体验改进UX improvementsCSV 输出支持多种日期时间格式使用帮助中显示实际二进制的名称文档与错误信息中统一使用 k6 cloud 措辞替代旧称 Load Impactsetup与handleSummary支持异步函数时间序列数量超过 100,000 时发出警告可能导致内存溢出问题新增退出码109用于标识 Go panic 导致的终止browser 模块 README 更新强调其已成为 k6 的内置模块多次调用browser.close时会向用户发出警告通配符选择器增加了错误处理终端错误输出更干净多实例可连接同一浏览器执行并发测试见上文browserType.Connect。关于退出码109当前仓库中可以直接验证errext/exitcodes/codes.go 定义了GoPanic ExitCode 109注释说明其表示脚本因 Go 运行时 panic 而中止与发布说明一一对应。关键 Bug 修复修复tracing.instrumentHTTP中 HTTPPOST与PUT方法被错误赋值的缺陷适配 Go 1.20 下 Windows 平台filepath.Join的新行为此前可能导致k6 archive与k6 cloud命令出现问题修复多预分配 VU 场景下check可能返回错误值的问题修复基于到达率arrival-rate执行器对活跃 VU 的统计上报xk6-websockets升级至 v0.2.0修复了可能导致整个 k6 卡死lock up的问题修复Trend.Max对负数值的支持修复 response 对象jSON方法到json的映射错误panic 时清理僵尸进程修复page.close会关闭整个浏览器上下文而非当前页面的问题。内存优化改进的 per-VU 缓冲池该版本改进的 per-VU 缓冲池可大幅降低内存占用代价是轻微的 CPU 开销上升与请求吞吐下降官方引用的 issue 讨论数据显示部分场景下内存占用最高可降低约 50%。源码印证当前仓库中该缓冲池实现位于 lib/buffer_pool.go。它基于 Go 标准库的sync.Pool实现BufferPoolGet从池中取出复用缓冲区Put归还前调用Reset()清空脏数据再入池避免把上一次使用的残留数据带进下一次复用。这种每 VU 独立缓冲 池化复用的设计正是高 VU 并发下抑制堆分配峰值的核心手段。维护与内部改进eventloop.WaitOnRegistered改为执行所有已注册的回调重构了模块加载机制为后续的 ESM 支持做准备k6 编译所用的 Go 版本升级至 1.20.xDocker 镜像基础更新为 alpine:3.17重构 goja 的isNullish至js/common重构sirupsen/logrus的用法新增 IBM z/OS 构建标志扩展平台兼容性修复了已检测到的内存泄漏升级依赖并加入 goja 的 generator 支持原 samples 目录更名为 examples对应当前仓库中的 examples/browser 模块修复 Go-JS 映射、多浏览器关闭、键盘上下键码错误等问题当环境变量提供 CDP URL 时Browser.Launch会自动转为Browser.Connect语义。相关仓库路径速查内容路径本文依据的发布说明release notes/v0.44.0.mdWeb Crypto 模块实现internal/js/modules/k6/webcrypto/module.gowebcrypto 示例集examples/webcrypto/README.mdwebcrypto 运行测试internal/js/modules/k6/webcrypto/cmd_run_test.go实验模块移除提示webcrypto 转正internal/js/jsmodules.goper-VU 缓冲池实现lib/buffer_pool.go退出码 109GoPanic定义errext/exitcodes/codes.gobrowser 远程连接示例examples/browser/remote.js小结v0.44.0 的价值体现在两条线上其一是能力扩展——webcrypto模块把 W3C 标准的密码学能力带进 k6 脚本后续版本已转正为全局cryptobrowser 模块则通过 Web Vitals 与browserType.Connect补齐了前端性能度量与高并发浏览器测试两块短板其二是工程健康度——per-VU 缓冲池带来的内存收益、模块加载重构为 ESM 铺路、以及一批针对执行器与统计的修复。若你正从更早版本升级需要重点处理的就是 browser 模块的三处破坏性变更locator.click的异步用法、root 用户下补回--no-sandbox、以及 FMP 指标到 Web Vitals 的迁移。【免费下载链接】k6A modern load testing tool, using Go and JavaScript项目地址: https://gitcode.com/GitHub_Trending/k6/k6创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考