Astro 宣布:將超過 500 多個測試從 Mocha 遷移到了 Node.js
近期,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/