Jest和Mocha對比:兩者之間有哪些區別?

什麼是單元測試?

  所謂單元測試,是對軟件中單個功能組件進行測試的一種軟件測試方式,其目的是確保代碼中的每一個基本單元都能正常運行。因此,開發人員在應用程序開發的整個過程(即代碼編寫過程)中都需要進行單元測試。在進入到軟件開發的下一階段之前,對程序進行單元測試是一個不錯的主意。單元測試非常有用,它使用簡單並且運行迅速。

  單元測試是測試驅動開發(TDD)的重要組成部分,在我們進行實際功能開發之前,它是用來描述功能的預期行爲以及我們想要它實現(或不實現)哪些功能的一種實踐方式。採用TDD的方式來進行軟件開發有幾個目的:

  • 這種技術可以幫助我們識別一些邊界情況,並確保在這些情況下我們的代碼仍然可以正常工作。
  • 幫助我們確定如何才能成功實現程序中的某項功能。
  • 隨着代碼庫的增長,單元測試可以確保新的修改不會對代碼庫中原有的功能產生不良影響。

Jest和Mocha介紹

Jest

  Jest是Facebook開發的一個JavaScript測試框架,它主要被用於基於React的應用程序測試,當然也可以用於Babel、JavaScript、Node、Angular和Vue。此外,它還可以用來測試NestJS、Next.js和GraphQL。Jest測試框架可以與其它JavaScript代碼庫進行整合,使你能夠非常容易地使用功能豐富的API來開發測試程序並快速地返回測試結果。

Jest的特點:

  • 零配置:Jest可以在沒有任何配置的情況下在大多數javaScript應用程序中運行,這意味着你可以將Jest作爲一個依賴項添加到項目中並開始編寫你的第一個測試程序,而不需要添加或者只需要添加非常少量的配置項。
  • 豐富的API:Jest以擁有健壯的API而聞名,這些API包含了針對各種不同需求的斷言。此外,它還擁有非常優秀的文檔,可以幫助你快速上手並運行測試程序。
  • 快照:對前端測試而言快照是必不可少的,因爲它們允許你驗證大量對象的完整性,這意味着你不需要創建包含斷言的冗長的測試來確保對象上的每個屬性都存在幷包含正確的值。
  • 隔離:在執行單元測試的過程中,隔離非常重要,它可以確保不同的測試結果之間不會相互干擾。Jest以並行方式運行測試,並且每個測試都在自己的進程中運行,所以各個測試之間不會相互干擾。Jest會協調管理所有的測試並收集測試結果。
  • 支持快照測試:快照測試可以確保我們要測試的應用程序的用戶界面不會在不同的版本之間發生意外的改變。
  • 對TypeScript的支持:通過安裝ts-jest包,Jest提供了對TypeScript的支持。
  • 兼容性:Jest框架可以和Angular、React、NodeJS、VueJS以及其它使用Babel的項目兼容。
  • Jasmine特性:Jest基於Jasmine,並且繼承了Jasmine的所有特性。雖然Jest從Jasmine脫離出來,但是它保留了Jasmine的所有特性並對功能進行了改進。
  • 速度:Jest是一款執行速度非常快的測試工具。當我們的測試程序受到CPU資源限制時,Jest可以在整個測試過程中節省大量的時間,例如,Jest將本地測試時間從45分鐘縮短到15分鐘。
  • Timer模擬:Jest可以通過下面幾種方法來操作時間:
  1. setTimeout
  2. clearInterval
  3. setInterval
  4. clearTimeout

Jest的使用限制

  • 使用自動mocking功能可能會導致測試程序運行緩慢。這是因爲模塊的依賴項越多,Jest就需要更多的時間來查找和模擬這些依賴項以完成代碼測試。
  • 對於那些創建大量包含數千行代碼的快照文件的項目而言,Jest快照測試並不適用。
  • Jest所包含的工具很少,與那些成熟的庫(如Mocha)相比,它的支持也不是很多。所以對那些希望使用IDE(如WebStorm)來運行和調試測試代碼的開發者來說,這可能是一個缺點。

Mocha

  Mocha是一款開源的JavaScript測試框架,可以在瀏覽器和Node.js中運行。Mocha可以用來測試同步異步代碼。

  Mocha可以提供靈活和精準的測試報告,同時可以將未捕獲的異常映射到相應的測試用例中。Mocha支持多種形式的測試,例如單元測試、集成測試,以及端到端的測試等。Mocha爲開發人員提供了一個基本的測試框架,同時它還包括大量的斷言、模擬和間諜庫,這些庫必須單獨安裝,其中Chai和Sinon非常受歡迎。

Mocha的特點

  • 支持任何斷言庫:Mocha支持許多JavaScript斷言庫,包括Express.js、Should.js和Chai,這使得我們可以非常容易地編寫測試代碼,對於編寫複雜的測試用例來說也會很輕鬆。
  • 支持同步和異步測試:Mocha通過執行測試用例中的回調函數來完成異步測試過程。如果不指定回調函數,Mocha也可以進行同步測試。
  • 同時支持BDD和TDD:Mocha同時支持行爲驅動開發(BDD——Behavior-Driven Development)和測試驅動開發(TDD——Test-Driven Development),使得構建高質量測試和增加代碼覆蓋率變得簡單。
  • 多瀏覽器支持:通過Mocha,我們可以非常容易地編寫在各主流瀏覽器中運行的測試代碼。同時Mocha還支持瀏覽器插件擴展。每個Mocha版本都包含了針對不同Web瀏覽器中對JavaScript和CSS構建的更新。
  • 多種安裝方式:Mocha可以在本地全局安裝,也可以作爲項目的依賴項進行局部安裝。另外,它也可以直接在Web瀏覽器中執行測試用例。

使用Mocha的限制

  • 與作爲獨立框架運行的Jest不同,Mocha需要的配置項更多,而且依賴的庫也比較多。
  • 在使用Mocha時必須爲其選擇一種斷言庫。

Jest和Mocha的全面比較

  乍一看,Jest和Mocha之間的區別不太大,但是有幾個地方我們必須考慮。

  首先,Jest被設計成一個獨立的測試框架,它不需要依賴於任何其它庫。而Mocha則需要藉助於其它庫來完成測試工作,所以使用Mocha時開發人員必須首先選擇在項目中使用哪些assertion庫、mocking庫以及其它庫。

  此外,Mocha並沒有爲這些第三方庫指定複雜的依賴關係,這也是它被認爲是一種有效的工具而能夠快速執行測試工作的原因之一。同樣,由於Mocha對這些庫的配置沒有嚴格要求,所以它被認爲是一個不錯的工具,而且通常比其它類似的工具使用起來更容易,運行更高效。

  相比Mocha而言,Jest所包含的特性要少一些,而且有些基本功能不支持,例如不支持異步測試。但是Jest最大的優點就是使用簡單。作爲一個輕量級的、簡單易用的測試框架,Jest也許是最好的選擇。

  Jest的運行速度比Mocha要快,這是因爲它具備快照測試能力,當代碼被修改時測試會自動執行,因而測試始終都能保持最新。

  Mocha提供了更多的功能,與Jest相比它更成熟,同時也擁有更多的社區貢獻者。

  讓我們快速看一下這個圖:

 

  上面顯示了兩個npm模塊的下載量隨時間變化的趨勢。可以看到,Jest的地位遠超Macha,其每週的下載量幾乎是Mocha的兩倍。不過,Mocha與Jest的市場定位不同,它更成熟,可靠性高,所提供的解決方案也更加緊湊。

我們應該使用哪個測試框架?

  Jest內置了許多工具,對開發人員來說,有些工具並不是必須的,這種將所有工具都打包到一起的做法對有些人來說並非受歡迎(想想後端項目中的快照測試)。但對其他人來說,這也並非是一個壞處,因爲這樣做避免了在需要時到處去找。

  許多人可能會認爲對很多後端項目而言,Mocha的這種按需配置提供了更多的靈活性。但假如測試程序的運行速度是一個必須要考慮的因素,那麼Mocha所帶來的這種靈活性與Jest的執行效率之間相比就需要認真考慮。

  對前端開發而言,使用Mocha的標準做法是使用框架的創建者所發佈的工具包,這樣有利於Mocha與工具包更好地集成,同時當框架的新版本發佈時,這些工具包也能更快地得到更新。React-Testing-Library很好地說明了爲什麼在React項目中Jest比Mocha更加合適。

  如果你的項目很大,並且要求足夠的靈活性和可定製性,那麼Mocha無疑是你最好的選擇。但是如果你的項目比較小而且不需要太多額外的配置項,那麼Jest則是最好的選擇。所以,對你和你的團隊來說究竟要選擇哪個測試框架這完全取決於你自己。

結論

  在本文中,我們對Jest和Mocha這兩種測試框架進行了簡要的分析和評估,以幫助我們在項目中如何選擇最合適的測試框架。更多內容可以訪問MochaJest的站點。

原文地址:Jest vs Mocha: What's the Difference?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章