近期,Astro 在其官方博客中宣布,虽然我们对 Mocha 感到满意,但也在寻求让我们的 CI 作业更快的方法。最终将超过 500 多个测试从 Mocha 迁移到了 Node.js。
先了解下 Astro 是什么?Astro 是适合构建像博客、营销网站、电子商务网站这样的以内容驱动的网站的 Web 框架。没有强绑定一些 UI 框架,它支持像 React、Preact、Svelte、Vue、Solid、Lit、HTMX、Web 组件等这些前端 UI 框架。
一开始,Astro 只是迁移了一个尚未使用 astro 集成套件的软件包:create-astro,由 Mocha 转为使用 Node.js 内置断言库 node:assert。
当成功迁移了第一个包后,潘多拉的盒子便已打开。之后开始尝试迁移 @astrojs/node 包的测试套件。这个集成是 Astro 下载量最大的集成之一。
根据其博客描述,对最终的结果是感到满意的。在迁移之后没有看到性能出现任何显著退化。
Node.js 内置测试模块毕竟还比较新,在实现过程中也有遇到一些问题的,例如:
- 一开始发现 “Node.js 测试运行器比 Mocha 慢得多”,经过调查发现是 Node.js 为每个测试文件生成了一个新进程,以确保每个测试套件都在隔离的环境中运行。这样好处是保证了测试环境不会被污染。但通过创建一个临时文件,导入所有的测试套件,让 Node.js 执行该文件,这样可在性能上得到保证。
- 不能传递 --test-concurrency 标志(仅在 Node.js 21 及以上版本可用)
- 参数名称冗长:
--test-name-pattern 而不是 --match,-m 参数;
--test-timeout 而不是 --timeout,-t 参数,等等。
- Mocha 中只需使用 it.only 就可以运行单个测试套件。而 Node.js 中你必须:
- 使用 --test-only 参数运行 CLI
- 将 .only 添加到包含要运行的 it.only 的 describe 中。
- 如果有多个 describe 实例,所有这些实例都需要标记为 .only。
对于 Astro 来讲,使用 Node.js 内置测试运行器,对于它们的主 monorepo 有一些优势:
- 减少了我们 monorepo 中需要安装和维护的依赖项:mocha 和 chai。
- API 迁移成本:Node.js 断言模块几乎提供了我们所需的所有功能,因此从 chai 迁移并不像我们想象的那么痛苦。
- 可维护性:有更多的人参与 Node.js 项目来维护 Node.js 测试运行器。
- 未来的好处:我们相信测试运行器会随着时间的推移而改进,并最终节省我们 CI 工作流程中的一些时间。
Astro 在其博客最后由提到以下两句话:
“Node.js 测试运行器仍然年轻,并且在积极开发中,有望变得更好。例如,Node.js 项目目前正在评估在我们提出使用案例后使用主进程运行测试”。
“以真正的开源合作精神,我们很高兴通过将我们的测试切换到 Node.js 来改进 Astro,反过来也将改进 Node.js 本身!”
这也是一种相互合作,相互成就吧!感谢 Astro 能够促进 Node.js 内置测试模块的发展!
参考 https://astro.build/blog/node-test-migration/