ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Jest 16.0 发布解读:Turbocharged CLI、快照格式重构与新匹配器

Jest 16.0 发布解读:Turbocharged CLI、快照格式重构与新匹配器 Jest 16.0 发布解读Turbocharged CLI、快照格式重构与新匹配器【免费下载链接】jestDelightful JavaScript Testing.项目地址: https://gitcode.com/gh_mirrors/je/jest本文基于 Jest 16.0 官方发布博客 整理而成。Jest 16 是 2016 年 10 月发布的重大版本距离上一大版本仅一个月它重构了命令行交互与快照子系统并完成 Jasmine 断言向新匹配器的迁移。读完本文你将掌握--testNamePattern、--findRelatedTests、--bail等 CLI 能力的使用场景理解快照格式变更的原因以及toBeInstanceOf、toContainEqual、test.concurrent等 API 的现代用法并能在当前仓库源码中找到它们的实现印证。版本背景一次聚焦开发者反馈的迭代Jest 16.0 发布于 2016 年 10 月是继上一大版本之后一个月的快速迭代。这个版本最核心的信号有两点CLI 体验大幅提速以及快照格式迎来一次不兼容更新——升级 Jest 后已存在的快照文件大概率需要重新生成。发布方在博客中明确表示这类格式变更不会频繁发生但为了长期可维护性偶尔的格式改进是必要的。值得注意的是Jest 16 已经是当时真正的社区协作产物项目贡献者超过 220 人。Jest 的目标始终是提供多种编写高效测试的方式而不牺牲性能与项目可维护性。升级的 CLI更快给出有用信号Jest 16 引入了全新的 reporter 界面实时展示正在运行的测试、基于上一次测试运行估算的进度条与实时汇总信息同时优化了 CLI 输出对不同配色方案的适配。最关键的体验改进是如果上一次运行存在失败测试本次会优先运行它们让用户最快获得最有价值的失败信号。新增 CLI 标志--testNamePattern / -t--testNamePatternpattern简写-t pattern用于在命令行按测试名称过滤效果类似在测试内使用it.only或fit但无需修改测试代码# 只运行名称匹配 /integration/ 的测试 jest -t integration从当前仓库源码看该参数在 packages/jest-cli/src/args.ts 中定义其描述为Run only tests with a name that matches the regex pattern并注册了别名t。在运行时packages/jest-circus/src/eventHandler.ts 会将其编译为大小写不敏感的正则state.testNamePattern new RegExp(event.testNamePattern, i);这也印证了博客中jest pattern现在大小写不敏感的改进。此外watch 模式下按t键会弹出交互式输入由 packages/jest-core/src/plugins/TestNamePattern.ts 插件驱动输入后通过updateConfigAndRun({mode: watch, testNamePattern: value})触发重跑。watch 模式可中断 --bail 支持Jest 16 之前watch 模式下发起一次测试运行后必须等它跑完。现在运行过程中随时按下 watch 模式的任一输入键a、o、p、q或enter即可中断当前运行并立即开启新一轮配合失败测试优先策略watch 模式的操作节奏大幅加快。同时--bail标志在 watch 模式下也生效。--bail的语义是遇到第 n 个失败测试后立即退出测试套件其参数定义见 packages/jest-cli/src/args.ts。在现代 watch 模式下bail与testNamePattern一样通过 packages/jest-core/src/lib/updateGlobalConfig.ts 合并进全局配置if (typeof options.bail boolean) { newConfig.bail options.bail ? 1 : 0; } else if (options.bail ! undefined) { newConfig.bail options.bail; }新增 --findRelatedTests为 pre-commit 而生--findRelatedTests fileA fileB用于运行与指定文件存在依赖关联的测试非常适合作为pre-commit 钩子只跑与本次改动文件相关的测试把验证成本降到最低。jest --findRelatedTests src/foo.js src/bar.js若未附带任何文件路径Jest 会直接报错错误信息与示例用法写在 packages/jest-cli/src/args.ts 的参数校验函数check中。其底层实现位于 packages/jest-core/src/SearchSource.ts通过dependencyResolver.resolveInverse(allPaths, isTestFilePath, ...)做反向依赖解析——给定源码文件反查出所有依赖它们的测试文件配合--coverage时还会基于resolveInverseModuleMap反推出需要纳入覆盖率统计的源码范围。其余 CLI 与工程化改进jsx扩展自动识别Jest 现在自动把.jsx后缀的文件视为候选测试文件与模块文件。从当前仓库的默认配置看moduleFileExtensions已覆盖js、mjs、cjs、jsx、ts、tsx等主流扩展名。重复 manual mock 文件告警当同一个模块存在多份手写 mock 时Jest 会给出警告避免改了 A 处没改 B 处的隐患。ES Modules mock 自动生成改进针对 Babel 编译后的 ES 模块自动生成的 mock 更符合预期。jest.clearAllMocks新增全局函数用于在测试之间清理所有 mock 的调用记录、实例与返回结果。当前实现位于 packages/jest-mock/src/index.ts通过重置内部的_mockState弱映射完成对应 CLI 选项--clearMocks等价于在每个测试前调用jest.clearAllMocks()。moduleNameMapper解析改进当使用moduleNameMapper做模块映射例如将图片、样式映射到桩模块时模块解析逻辑得到优化。Snapshot 更新彻底重写的 jest-snapshotJest 的快照实现被完全重写。新版jest-snapshot包在架构上按模块拆分便于被其他测试运行器集成当时即推动了与 React Storybook 等工具的联动。重写还带来一个行为修正在包含跳过或失败测试的文件中Jest 不再将其中的快照标记为 obsolete——避免误删那些尚未跑完验证流程的快照。快照格式的三项变更对象与数组打印尾随逗号{ a: 1, b: 2 }这类结构现在以{ a: 1, b: 2, }的形式输出减少未来字段增删导致的格式级 diff 噪音。移除函数名快照中不再输出函数名。原因是函数名在不同 Node 版本、代码覆盖率插桩场景下都不稳定且对用户而言函数名变了并不是有意义的信号。文件内自然排序同一快照文件内的快照条目按自然排序顺序组织保证输出顺序的确定性。升级时的 diff 长什么样由于上述格式变化从旧版本升级到 Jest 16 时--updateSnapshot-u前看到的失败 diff 大致如下函数名如[Function bound ...]被替换为无名的[Function]对象字面量带上了尾逗号整体出现大面积的增删行。此时直接执行jest -u重录快照即可完成迁移。该标志的参数定义与可与--testNamePattern组合、仅重录匹配测试的快照的用法见 packages/jest-cli/src/args.ts。Test Library 更新Jasmine 断言迁移收官三个新匹配器Jest 完成了 Jasmine 断言到新匹配器的迁移并新增三个匹配器匹配器作用toBeInstanceOf断言接收值是某个构造函数或类的实例如expect(err).toBeInstanceOf(Error)toContainEqual断言可迭代结构中包含与期望值深度相等的元素常用于数组内嵌对象的匹配toThrowErrorMatchingSnapshot断言函数抛出错误并将错误信息与快照比对适合对错误消息做回归守护后两者配合使用尤其适合错误消息可读性的测试先用toThrowErrorMatchingSnapshot固化错误文案未来文案变化会以快照 diff 的形式暴露。这三个匹配器的当前实现分别位于 packages/expect/src/matchers.tstoBeInstanceOf与同文件toContainEqual第 569 行附近。spy/mock 匹配器失败信息更可读toHaveBeenLastCalledWith、toHaveBeenCalledWith及其别名lastCalledWith、toBeCalledWith等 mock 匹配器的失败消息被重写现在能更清晰地展示实际调用参数与期望参数之间的差异。所有断言完成重写并拆分到独立包后Jest 团队的下一个目标是让这些匹配器脱离 Jest 独立使用可集成到任意测试框架中。断言别名与并发测试根据社区呼声Jest 16 补齐了一系列describe/it/test的别名聚焦单个测试it.only、test.only或继续使用fit跳过测试it.skip、test.skip或继续使用xit并发测试test.concurrent适用于访问网络资源或数据库的测试场景现代版本中并发上限由--maxConcurrency控制定义见 packages/jest-cli/src/args.ts。覆盖 expect 全局setupTestFrameworkScriptFile如果你希望用 chai 等第三方断言库替换 Jest 自带的expect全局可以通过setupTestFrameworkScriptFile配置项指向一个设置脚本在其中自行覆盖全局断言。需要说明的是这一配置在现代 Jest 中已废弃被setupFilesAfterEnv取代后者定义见 packages/jest-cli/src/args.ts但它开启的用配置注入自定义框架行为思路一直延续至今——例如在 setup 文件中引入 expect-extend 示例 那样的自定义匹配器。Community Update快照测试生态的成形发布同期社区围绕快照测试产生了大量讨论。当时最受 Jest 团队认可的一篇文章总结了三个要点至今仍是快照测试的最佳实践准则快照测试是常规测试的补充而非替代——它解决的是工程师原本不会去写测试的代码React 组件渲染结果、CLI 输出、错误消息等但不解决所有问题快照测试在有健康 code review 流程时更有价值——快照变更应当被审查者审阅而不是被无脑-u吞掉快照测试与自动 mockauto-mocking配合效果最佳——mock 掉不稳定依赖后快照反映的才是被测单元自身的输出。围绕快照能力的生态也在此时成形社区出现了将 enzyme 组件树序列化为 JSON 以配合 Jest 快照的enzyme-to-json工具以及自动把其他测试框架语法转换为 Jest 语法的jest-codemods——后者让开发者可以低成本评估Jest 是否适合我。大型项目层面Redux 在此时期正式采用 Jest 作为测试框架create-react-app 也将 Jest 内置为默认测试方案。这些能力在本仓库的测试套件中均有对应验证例如 e2e/tests/snapshot.test.ts 覆盖快照的基础行为e2e/tests/toThrowErrorMatchingSnapshot.test.ts 验证错误快照匹配器e2e/tests/testNamePattern.test.ts 与 e2e/tests/watchModePatterns.test.ts 则分别守护了--testNamePattern与 watch 模式过滤的行为。读者可结合这些用例深入理解每个特性。结语回顾 Jest 16其核心思路可以用一句话概括在 CLI 上更快给出信号在快照上更稳定的格式在 API 上更完整的断言与别名。这三大方向——CLI 交互效率、快照稳定性、匹配器完备性——在此后十余年的版本演进中始终是 Jest 迭代的主线。今天你在jest -t、jest --findRelatedTests、test.concurrent中看到的用法其雏形都可以追溯到这一个版本。【免费下载链接】jestDelightful JavaScript Testing.项目地址: https://gitcode.com/gh_mirrors/je/jest创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表