放棄 Jest 后,運(yùn)行時(shí)間減少 90%!
這是一個(gè)關(guān)于 Jest 在 JS 服務(wù)端的經(jīng)驗(yàn)分享,注意,不是 UI 測(cè)試。如果你對(duì) Jest 感到滿意,請(qǐng)不要切換!這不是為了說(shuō)服任何人。
Jest 是個(gè)眾所周知的、功能完備的測(cè)試框架,曾經(jīng)在選擇時(shí)并沒有經(jīng)過(guò)深思熟慮。然而,經(jīng)過(guò)數(shù)百次測(cè)試后,情況開始變得很糟糕。內(nèi)存泄漏開始浮出水面,臨時(shí)的標(biāo)志位數(shù)量增多,經(jīng)常訪問(wèn) Jest 的 issues 標(biāo)簽頁(yè)已經(jīng)成為家常便飯。
問(wèn)題
以下是作者曾在 Jest 中遇到的一些問(wèn)題,通過(guò)這些標(biāo)志可以幫助排插問(wèn)題或提高部分的性能,如果你在使用 Jest,可以做為一個(gè)參考。
jest —logHeapUsage
:監(jiān)視堆使內(nèi)存用情況,以發(fā)現(xiàn)突然增長(zhǎng)的內(nèi)存泄漏。jest —maxWorkers=50%
:一些基準(zhǔn)測(cè)試顯示,該配置可使測(cè)試運(yùn)行速度提高 20%,也有些人說(shuō)這會(huì)變得更糟。jest —runInBand
: 這在當(dāng)前進(jìn)程中串行運(yùn)行所有測(cè)試,而不是創(chuàng)建一個(gè)子進(jìn)程的工作池。有人說(shuō)這對(duì)于調(diào)試很有用,但奇怪的是,一些人報(bào)告說(shuō)它實(shí)際上可以提高性能。jest —changedSince
:該標(biāo)志可以顯著減少 PR 工作流程所需的時(shí)間。jest-slow-test-reporter
:這個(gè)報(bào)告器可以發(fā)現(xiàn)你項(xiàng)目中最慢的測(cè)試。--expose-gc
:暴露 Node.js 的垃圾收集器。某些情況下,使用 --expose-gc 標(biāo)志運(yùn)行 Node 似乎能更好地處理內(nèi)存泄漏。
不夠好
這些策略中的一些在這段時(shí)間內(nèi)顯著減少了運(yùn)行時(shí)間。然而,學(xué)習(xí)和實(shí)施它們的過(guò)程是以交付時(shí)間為代價(jià)的,而這實(shí)際上更為關(guān)鍵。
測(cè)試是如此緩慢,以至于我只在我們當(dāng)前正在開發(fā)的模塊上運(yùn)行它們,然后只在PR中更改的模塊上運(yùn)行它們,最后,所有的測(cè)試只有在合并到主分支時(shí)才會(huì)運(yùn)行。不幸的是,這種方法導(dǎo)致了識(shí)別錯(cuò)誤的延遲。
測(cè)試如此耗時(shí),以至于我發(fā)現(xiàn)自己在為某些功能猶豫是否編寫測(cè)試,擔(dān)心它們會(huì)導(dǎo)致額外的構(gòu)建過(guò)程時(shí)間。在這一點(diǎn)上,我意識(shí)到是時(shí)候轉(zhuǎn)變了
切換到 Mocha
我十年前用過(guò) Mocha,感覺非常棒。所以,我以為回到 Mocha 會(huì)很順利。在過(guò)去的幾年里,我看到人們一直在拋棄從 Jest 到 Mocha 的想法,而我總是覺得很有趣。我記得有很多指南和人們?cè)谡務(wù)搹?Mocha 遷移到 Jest。像我一樣,大多數(shù)人會(huì)認(rèn)為更新的工具會(huì)有更好或者至少類似的性能。
遷移比預(yù)期的要容易得多。幾個(gè)替換案例,少于一個(gè)小時(shí)的重構(gòu)一些代碼。比較困難的部分是模擬引擎,這在 Mocha 中沒有包含。
我本來(lái)可以使用 Sinon.js 來(lái)做到這一點(diǎn),但我真的很喜歡有一天不依賴任何測(cè)試庫(kù)的想法。我甚至考慮過(guò)只使用新的 Node.js 內(nèi)置測(cè)試運(yùn)行器,但對(duì)我來(lái)說(shuō)它還不夠完善。所以,我決定只使用內(nèi)置的 MockTracker。
嘗試后讓人驚訝。使用 Jest 運(yùn)行需要3秒的單個(gè)測(cè)試,在 Mocha 中只需要不到 200ms。這應(yīng)該不足為奇——我運(yùn)行的測(cè)試不應(yīng)該花費(fèi)那么長(zhǎng)時(shí)間,但我已經(jīng)習(xí)慣了那種緩慢。最終,我們的測(cè)試運(yùn)行時(shí)間從超過(guò) 12 分鐘縮短到不到 40 秒。
Mocha 的速度幫助我們發(fā)現(xiàn)了隱藏的錯(cuò)誤,這些錯(cuò)誤偶爾會(huì)導(dǎo)致測(cè)試失敗,因?yàn)樗鼈冎辉诜浅L厥獾臈l件下發(fā)生——這些條件在 Jest 中由于其較慢
結(jié)論
我仍然在我維護(hù)的一些較小的代碼庫(kù)中使用 Jest,并且除非它們成為問(wèn)題,否則我不會(huì)瘋狂地遷移它們。然而,對(duì)于未來(lái)的項(xiàng)目,我肯定會(huì)選擇 Mocha 或 Node.js 測(cè)試運(yùn)行器。
問(wèn)題在于,即使有一種方法可以優(yōu)化 Jest 并在合理的時(shí)間內(nèi)運(yùn)行數(shù)千個(gè)測(cè)試,但僅僅切換測(cè)試框架就能顯著提高性能,這是有問(wèn)題的。你同意嗎?你有類似的經(jīng)歷嗎?我很樂(lè)意聽聽。
作者 | Patrickrbc翻譯、整理 | 五月君原文 https://patrickrbc.com/2024/03/16/jest-slow-tests