跳至主内容

Jest 23:🔥 极速畅快的测试体验

· 8 分钟阅读
Ricky Hanlon
Ricky Hanlon
非官方测试版翻译

本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →

今天,我们激动地宣布 Jest 23 正式发布——这是迄今为止我们规模最大的一次主版本更新!在超过 100 位贡献者的共同努力下,我们带来了大量新功能和错误修复。感谢社区中的每一位成员,是你们让 JavaScript 测试变得如此畅快!

我们还要热烈欢迎 Babelwebpack 加入 Jest 社区!在从 Mocha 迁移到 Jest 23 Beta 后,webpack 的完整测试套件执行时间缩短了 6 倍——从超过 13 分钟降至 2 分 20 秒。#blazingmeansgood

以下是一些 Jest 23 的重要亮点和破坏性变更。

完整变更清单请参阅 更新日志

交互式快照模式

我们新增了名为"交互式快照模式"的默认监视菜单选项。该模式允许您逐步检查每个失败测试套件中的快照差异,逐个审阅失败的快照并选择更新或跳过。

交互式快照模式演示

查看交互式快照模式文档请点击这里

快照属性匹配器

快照中的对象常包含动态生成的值(如日期和 ID)。现在,您可以向快照匹配器传递属性匹配器来指定数据结构而非具体值。这些属性匹配器会在序列化前验证匹配器类型(而非具体数值),确保跨测试运行的快照结果一致。

快照属性匹配器示例

查看更新后的 toMatchSnapshot 文档或属性匹配器使用指南获取更多信息。

自定义异步匹配器

现在通过 expect.extends 支持异步匹配器!异步匹配器会返回 Promise,您可以用 await 等待匹配器解析。示例如下:

自定义异步匹配器示例

文档参见此处

自定义非对称匹配器

当您只需关注非对称相等性时(例如左侧对象只需包含右侧的部分属性而非完全匹配),非对称匹配器是绝佳工具。Jest 已内置多种非对称匹配器,而本次更新我们推出了自定义非对称匹配器功能。

自定义非对称匹配器示例

Jest Each 数据驱动测试

感谢 @mattphillipsiojest-each 包捐赠给 Jest 核心项目!jest-each 受到 mocha-eachSpock 数据表的启发,允许您定义测试用例表格,然后逐行运行使用指定列值的测试。我们支持数组类型和模板字面量,适配所有类型的 describetest。文档参见此处。对于尚未升级 Jest 23 的用户,我们仍在单独维护 jest-each

jest-each 使用示例

衷心感谢 Prettier 团队如此迅速地修复了表格格式问题(详见 Prettier 1.13)!

新增匹配器

我们只在确信新匹配器能惠及广大 Jest 用户时才会将其加入核心库,大多数匹配器仍由社区维护(推荐使用 jest-extended)。以下匹配器成功入选 Jest 23:

  • nthCalledWith

  • toReturn

  • toReturnTimes

  • toReturnWith

  • lastReturnedWith

  • nthReturnedWith

  • toStrictEqual

新增匹配器实战演示

请参阅更新后的 expect 文档此处

调试挂起的测试

我们在问题跟踪系统中经常看到关于"Jest 在测试运行后挂起"的反馈,这通常是因为应用程序代码未关闭句柄,导致 Jest 无法退出。过去用户只能依赖 --forceExit 解决(不推荐)。

为协助调试此类问题,我们新增了未退出检测功能:

检测挂起的测试

同时提供新标志 --detectOpenHandles 帮助定位未关闭的句柄:

运行 detectOpenHandles

请参阅更新后的 CLI 文档此处

监视模式插件

我们完全重写了监视模式系统,现支持添加自定义插件。监视模式插件允许接入 Jest 事件并在监视菜单中提供自定义选项,所有默认监视提示均已通过此系统实现为插件。自定义插件文档详见此处

借此改进,我们通过 jest-watch-typeahead 重新实现了自动补全功能!

自动补全插件实战演示

安装说明和文档详见 jest-watch-typeahead。特别感谢 @rogeliog 开发了新的监视模式插件系统及 jest-watch-typeahead 插件!

破坏性变更

与每个主要版本相同,我们进行了几项重大变更以支持未来更大规模的改进,推动测试体验进入新阶段。以下是您可能遇到的主要变更:

  • 要求测试描述和函数:缺少测试函数或描述的测试用例现会被标记为失败

  • 从 React 快照中移除 undefined 属性:生成更精简的快照并符合 React 规范

  • 移除弃用功能:删除不再需要的 mapCoverage。同时移除 jest.genMockFunctionjest.genMockFn(功能与 jest.fn 重复)

  • 快照失败信息中显示快照名称:在快照失败消息中增加快照名称(如有),便于定位问题快照

  • 替换模拟时间戳:我们使用调用顺序(invocationCallOrder)替代了模拟时间戳,因为多个模拟对象常会出现相同时间戳,导致无法测试调用顺序。

  • 为模拟快照添加结果:我们将模拟函数调用结果加入快照,从而同时追踪调用的过程和执行结果。

其他改进

  • 监听模式覆盖率:现在覆盖率仅统计监听模式或使用 --onlyChanged--findRelatedTests 时测试的文件。

  • 版本文档:我们补充了自 Jest 22 起每个次要版本的文档,并移除了文档中所有"Requires Jest X.X+"的标注。

  • 优化快照摘要:我们重构了快照摘要输出,使过期快照的提示信息更具参考价值。

  • 优化堆栈追踪:我们为异步错误、超时错误、expect.assertions 以及非错误对象的抛出添加了堆栈追踪,并在代码框架中标注了列位置!

  • 增强 React 16 支持:新增对 React.FragmentReact.forwardRefReact.createContext 的快照支持。

  • 追踪模拟返回与抛出值:新增 mock.results 属性,包含每次模拟调用的返回值或抛出值。

  • 极致速度 🔥:我们在 README 中添加了火焰徽章,彰显 Jest 的卓越性能。

Jest 峰会

上周,Jest 核心团队在 Facebook 伦敦办公室举行了 Jest 峰会。我们共同完成了 Jest 23 的发布,宣布了 Jest 开放集体计划,并进行了多场演讲:

完整演讲视频请见此处

本次峰会反响热烈,我们得以与众多伦敦本地的社区成员面对面交流。感谢所有参与者的支持!请持续关注我们后续关于 Jest 开放集体计划及未来蓝图的专题文章。

一如既往,本次发布的成功离不开广大 JavaScript 社区的支持。我们深感荣幸能共同推动 JavaScript 测试技术的进步。若您有意为 Jest 贡献力量,欢迎随时通过 GitHub Discord 与我们联系。