跳至主内容

Jest 25:🚀 为未来奠定基础

· 7 分钟阅读
Simen Bekkhus
Simen Bekkhus
非官方测试版翻译

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

Jest 25 正在为未来的重大变革奠定基础。为此,我们将破坏性变更控制在最低限度,但内部架构调整可能在升级过程中需要特别注意。主要变化包括将 JSDOM 从 v11 升级至 v15、测试运行速度提升 10-15%、新增过期快照的差异视图,以及放弃对 Node 6 的支持。

自 Jest 24.9 以来,已有超过 80 位贡献者提交了 200 多次代码更新。和往常一样,请查看更新日志获取完整的变更列表。

告别 Node 6

Node 6 自 2019 年 4 月 30 日起已停止维护(EOL),Jest 25 将不再支持它。放弃 Node 6 意味着我们可以升级核心依赖(尤其是 JSDOM 已升级至 v15),同时不再需要转译 async-await 语法,这不仅提升了代码执行速度,还降低了内存消耗。额外好处是:当您深入调试时,Jest 的转译代码将更容易理解。

尽管 Node 8 也已停止维护,但 Jest 25 仍将保持对其支持,以便仍在维护 Node 8 的项目能平滑升级。不过这会带来一些取舍:例如 JSDOM v16 已不再支持 Node 8,因此如果您需要使用最新版本,请安装 jest-environment-jsdom-sixteen

性能优化

我们收到反馈称 Jest 在近几个版本中速度有所下降。Jest 25 升级了 Micromatch 库,显著缩短了启动时间,并通过错误修复和性能调优使运行速度回归到 Jest 23 的水平。如本文开头所述,这意味着测试运行时间整体减少 10-15%。我们始终致力于持续改进,欢迎您对比历史版本的表现,如果发现优化空间请随时提交 issue!

V8 代码覆盖率

当前 Jest 的代码覆盖率检测机制依赖 babel-plugin-istanbul 在生成报告前插入统计代码。这种方式在大型文件和代码库中效率较低且内存占用高。值得庆幸的是,在 Benjamin Coe 和 V8/Node.js 团队的努力下,V8 内置的覆盖率功能在 Node 中的可用性日益增强。Jest 25 通过新的 --coverage-provider 标志提供实验性支持,具体限制和使用方法请参阅文档

测试失败时的快思考与慢思考

测试失败时解读报告的额外负担会阻碍:

  • "快思考":基于经验快速识别模式

  • "慢思考":分析变更属于预期进展还是意外倒退

Jest 25 完成了始于 Jest 24 的匹配器优化工作:

  • 修正描述行(支持 .rejects.resolves.not 修饰符)

  • 精简的标签与统一对齐的预期值/实际值

  • 字符串比对时的子串差异反色高亮

  • 差异行变更计数(区分纯删除或插入)

特别感谢 Jest 维护者 Mark Pedrotti 主导此项优化,并持续改进期望错误提示的可读性。

快照测试失败的差异着色

最明显的变化体现在快照测试失败时的差异显示中:变更行的颜色调整旨在消除困惑、增强信心:

  • - Snapshot 从绿色改为洋红色

  • + Received 从红色改为前景色蓝绿色搭配青色背景

快照测试报告示例(左侧为更改前,右侧为更改后)

  1. 变更行数统计可快速确认快照变动方向(即删除或新增行)

snapshot-insert-lines

  1. 背景色引导视线聚焦相邻变更行的对比

snapshot-change-lines

  1. 背景色还有助于识别哪些toThrow测试需要决定是否更新快照

snapshot-change-substrings

选择独特配色的原因如下:

  • 95%色觉正常者可快速区分快照测试报告与其他匹配器报告

  • 解决了Jest测试中红绿色义与代码审查中红绿色义的直接冲突

  • 区别于红绿反转(暗示更新是默认操作),独特配色表明本地快照失败时的差异需要比代码审查(问题已修复)更谨慎的回归检查

从洋红色(300°)到蓝绿/青色(180°)的色相差异优化了色觉无障碍体验,变更行的浅色背景底色确保亮/暗主题下均有稳定对比度

命令行工具维护者可参考#9132获取无障碍优化灵感

ECMAScript 模块支持

Node 13已默认支持ESM,我们已启动Jest原生支持的初步工作。Jest 25支持jest.config.cjsjest.config.mjs配置文件,但测试文件仍需通过Babel/TypeScript转换为CJS格式

Jest将使用的API仍处于实验阶段(需启用标记),暂无法提供即时支持。Node.js模块团队正积极完善这些API,我们将持续跟进实验并提供反馈。可通过订阅此issue获取Jest实现进展

其他改进与更新

  • Jest已拥有超1000位独立贡献者。感谢每位助力测试体验优化的伙伴!

  • 社区成员Josh Rosenstein为多数匹配器(如toBeGreaterThan)添加了BigInt支持,Jest现可原生解析bigint字面量

  • --detect-leaks功能在Node 12+版本失效的问题已在Jest 25修复

  • 如Jest 24博文所述,代码库已用TypeScript重写(Jest 24.3完成)。使用Jest独立模块时将获得更好的IDE集成。我们计划优化Jest模拟(mocks)与类型系统的兼容性,欢迎在此处贡献方案或PR!同时拟将测试运行器类型定义从DefinitelyTyped迁移至Jest主库

  • jest-diff 包现在导出了 diffLinesUnifieddiffStringsUnified 等可配置函数,使其他应用能以自定义方式格式化差异。更多信息和代码示例,请参阅 Jest 仓库中的新 README.md 文件或在包仓库中查看。

  • 感谢社区成员 Wei An An,Jest 将不再在期望错误中高亮显示通过的非对称匹配器。这一直是非对称匹配器的长期痛点,我们非常高兴它终于得到解决。

  • Jest 连续第二年荣获 State of JS 最高满意度奖。我们对社区的支持深表感激,希望借此势头让 2020 年更加精彩!

未来计划

  • Jest 的配置体系庞大且略显笨拙,相同功能往往存在至少两种实现方式(甚至更多)。我们计划在 Jest 26 中精简配置并提高可预测性,详情请参阅此 issue

  • 我们还将提供更完善的编程 API 来运行 Jest,以简化 IDE 和其他工具的集成流程,请关注此 跟踪 issue

  • 自 2017 年 12 月以来,我们持续探索将 Lolex 作为 Jest 假计时器的实现方案。虽然在 Jest 25 中不会将其加入公共 API,但已包含技术支持。我们正在研究如何开放此功能供用户测试验证。使用该方案可模拟 Date 等 Jest 当前未处理的计时器函数(注意:此功能尚属实验性质,正式 API 支持将在后续版本推出)。请关注 此 PR 获取最新进展。

祝大家测试愉快! 🃏