Astro 宣布:將超過 500 多個(gè)測試從 Mocha 遷移到了 Node.js
近期,Astro 在其官方博客中宣布,雖然我們對 Mocha 感到滿意,但也在尋求讓我們的 CI 作業(yè)更快的方法。最終將超過 500 多個(gè)測試從 Mocha 遷移到了 Node.js。
先了解下 Astro 是什么?Astro 是適合構(gòu)建像博客、營銷網(wǎng)站、電子商務(wù)網(wǎng)站這樣的以內(nèi)容驅(qū)動的網(wǎng)站的 Web 框架。沒有強(qiáng)綁定一些 UI 框架,它支持像 React、Preact、Svelte、Vue、Solid、Lit、HTMX、Web 組件等這些前端 UI 框架。
一開始,Astro 只是遷移了一個(gè)尚未使用 astro 集成套件的軟件包:create-astro,由 Mocha 轉(zhuǎn)為使用 Node.js 內(nèi)置斷言庫 node:assert。
當(dāng)成功遷移了第一個(gè)包后,潘多拉的盒子便已打開。之后開始嘗試遷移 @astrojs/node 包的測試套件。這個(gè)集成是 Astro 下載量最大的集成之一。
根據(jù)其博客描述,對最終的結(jié)果是感到滿意的。在遷移之后沒有看到性能出現(xiàn)任何顯著退化。
Node.js 內(nèi)置測試模塊畢竟還比較新,在實(shí)現(xiàn)過程中也有遇到一些問題的,例如:
- 一開始發(fā)現(xiàn) “Node.js 測試運(yùn)行器比 Mocha 慢得多”,經(jīng)過調(diào)查發(fā)現(xiàn)是 Node.js 為每個(gè)測試文件生成了一個(gè)新進(jìn)程,以確保每個(gè)測試套件都在隔離的環(huán)境中運(yùn)行。這樣好處是保證了測試環(huán)境不會被污染。但通過創(chuàng)建一個(gè)臨時(shí)文件,導(dǎo)入所有的測試套件,讓 Node.js 執(zhí)行該文件,這樣可在性能上得到保證。
- 不能傳遞 --test-concurrency 標(biāo)志(僅在 Node.js 21 及以上版本可用)
- 參數(shù)名稱冗長:
--test-name-pattern 而不是 --match,-m 參數(shù);
--test-timeout 而不是 --timeout,-t 參數(shù),等等。
- Mocha 中只需使用 it.only 就可以運(yùn)行單個(gè)測試套件。而 Node.js 中你必須:
- 使用 --test-only 參數(shù)運(yùn)行 CLI
- 將 .only 添加到包含要運(yùn)行的 it.only 的 describe 中。
- 如果有多個(gè) describe 實(shí)例,所有這些實(shí)例都需要標(biāo)記為 .only。
對于 Astro 來講,使用 Node.js 內(nèi)置測試運(yùn)行器,對于它們的主 monorepo 有一些優(yōu)勢:
- 減少了我們 monorepo 中需要安裝和維護(hù)的依賴項(xiàng):mocha 和 chai。
- API 遷移成本:Node.js 斷言模塊幾乎提供了我們所需的所有功能,因此從 chai 遷移并不像我們想象的那么痛苦。
- 可維護(hù)性:有更多的人參與 Node.js 項(xiàng)目來維護(hù) Node.js 測試運(yùn)行器。
- 未來的好處:我們相信測試運(yùn)行器會隨著時(shí)間的推移而改進(jìn),并最終節(jié)省我們 CI 工作流程中的一些時(shí)間。
Astro 在其博客最后由提到以下兩句話:
“Node.js 測試運(yùn)行器仍然年輕,并且在積極開發(fā)中,有望變得更好。例如,Node.js 項(xiàng)目目前正在評估在我們提出使用案例后使用主進(jìn)程運(yùn)行測試”。
“以真正的開源合作精神,我們很高興通過將我們的測試切換到 Node.js 來改進(jìn) Astro,反過來也將改進(jìn) Node.js 本身!”
這也是一種相互合作,相互成就吧!感謝 Astro 能夠促進(jìn) Node.js 內(nèi)置測試模塊的發(fā)展!
參考 https://astro.build/blog/node-test-migration/