近期,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/
- END -
首部 Node.js 记录片发布,通过该纪录片深入了解 Node.js 的起源,认识一些最早的贡献者,主要包括 Ryan Dahl(Node.js 的创始人)、Isaac Schlueter(NPM 的创始人)等。