JavaScript 單元測試框架: Jasmine, Mocha, AVA, Tape 和 Jest 的比較
當開始開發新前端專案的時候,我經常會問自己兩個問題:“我應該用那一個 JavaScript 單元測試框架呢?” 和 “我應該花時間去新增測試程式碼嗎?”
我的同事經常寫一些有關單元測試如何讓腦子平靜下來且減少軟體錯誤的文章。所以我也總會花時間來做測試。但是在你的專案中應該選那個框架來做測試呢?在匆忙做出決定之前,我搜集了 5 個最受歡迎的 JavaScript 單元測試框架,讓你決定那一個才是最合適你的。
注意:如果你已經有更喜歡的測試框架並且它沒有出現在下面列表中,在評論中讓我知道我會新增到文章中。
JavaScript 單元測試框架:比較
Jasmine
最受歡迎的 Javascript 單元測試框架之一,Jasmine提供所有你所需要的功能並且開箱即用。
- Jasmine 帶有 assertions(斷言),spies (用來模擬函式的執行環境),和 mocks (mock 工具),非常完美地配備幾乎是你開始寫單元測試時需要的所有東西。Jasmine 初始化設定簡單同時如果你需要一些單元功能的時候你仍然可以加一些庫進來 (括號內容:譯者注)
- 全域性性使它更容易在你的應用中立即開始測試。雖然我並不喜歡全域性性,但是和 Jasmine 提供給開發者全部需要的開箱即用功能,並沒有太多的不一致的地方
- 我發現獨立版本能讓它更容易去理解所有東西是怎樣設定的,並能讓你能立刻開始使用它
- 時至今日已經能和 Angular 1 或者 Angular 2 或者更多流行庫組合使用了
我對 Jasmine 的看法
我不是佔有全域性變數環境的粉絲,所以 Jasmine 會在我的小本子上面丟些分。在另一方面,它有很多很好的即開即用功能。它看上去會顯得稍微 “老些” 比起其它在這列表的框架,但是這並不是一件壞事,其它框架可能遇到的痛點,意味著它們更應更容易被解決。
AVA
一個簡約的測試庫,AVA 它的優勢是 JavaScript 的非同步特性和併發執行測試, 這反過來提高了效能。
- AVA 不會建立全域性環境給你,因此你能更容易控制你所使用的內容。我想這會給測試帶來額外的清晰度確保你清楚什麼正在發生
- 利用了 JavaScript 的非同步特性優勢為測試提供了額外的好處。最主要的好處是優化了在部署的時間等待
- 保留了簡單的 API 為你提供你所需要的功能。如果你搭配 mocking 來使用它會顯得更加友好,但是你必須安裝一個單獨的庫
- 當你想知道應用 UI 什麼時候會有超出預期的改變的時候 jest-snapshot 提供了非常好用的快照測試
我對 AVA 的看法
Ava “最有見地的” 是極簡方法, 還有他不是佔有全域性環境的,這讓他在我的小本子上獲得很高的分數。簡單的 API 讓測試更清晰。在你選擇 JavaScript 單元測試框架的時候,AVA 測試庫你是絕對應該嘗試的。
Tape
這是在這份框架列表上最小的一個框架,Tape 是最直接開門見山的,提供最基礎的功能。
- 就像 AVA 一樣,Tape 不提供全域性環境,取而代之的是得要你自己匯入他們。 這還是很不錯的只要它不汙染到全域性環境
- Tape 不包括安裝/解除安裝方法. 取兒替之的是, 它選擇了一個多模組系統在那裡你需要明確定義安裝程式碼在每一個測試裡面以使每個測試更清晰。 它同時會阻止狀態在測試之間共享
- 支援 Typescript/coffeescript/es6
- 簡易快速地搭建以及執行,Tape 是一個你可以在任何可以執行 JavaScript 的環境中執行的 JavaScript 檔案,並且沒有過多的配置選項
我對 Tape 的看法
Tape 包含更底層,比 AVA 功能更少的 API,並以此為傲。Tape 讓所有事情變得簡單,只給你所需要的東西。這就是為什麼 Tape 在我的小本子上有著高分數並且是最好的 JavaScript 單元測試框架之一,它讓你更專注於產品而不是工具的選擇。
Mocha
作為可以說是使用最多的庫,Mocha 是一個靈活的庫,提供給開發者的只有一個基礎測試結構。然後其它功能性的功能如 assertions, spies,mocks,和像它們一樣的其它功能需要引用新增其它庫/外掛來完成。
- 如果你想要更靈活的配置,匯入你特定需要的庫,那麼 Mocha 額外的安裝與所需要的配置是你必須要看的
- 不幸的是,上面的觀點確實還存在問題,它必須匯入額外的庫來實現 assertions (譯者注:斷言功能)。如果不是長時間使用,這確實意味著比其它的更難一點去設定. 他們說,設定通常只是一次性操作,但是我更喜歡去做一個 “單一來源的事實” (文件) 代替在文件間跳來跳去地設定
- Mocha 匯入測試結構作為全域性變數,省去你的時間你不再需要
include
或者請求它在每個檔案中。缺點是無論如何那些外掛還是要你使用require
匯入到裡面,這會導致不一致,如果你像我一樣是個 OCD (譯者注:強迫症患者) 它最終會把你弄瘋的!
我對 Mocha 的看法
可擴充套件性和數種不同配置 Mocha 的方式另我印象深刻。必須去學習 Mocha,然後也必須去學習你選擇的 assertion 庫這的確嚇到了我不少。靈活性在於它的 assertions,spies 和 mocks 帶給它的高收益。
Jest
被 Facebook 和各種 React 應用推薦和使用,Jest 得到了很好的支援。Jest 也被發現是一個非常快速的測試庫在平行測試報告中。
- 對於小型專案來說你可能在開始的時候不用過多擔心,而效能的提高對於希望全天 持續部署 的大型應用 app 來說是非常之好的
- 而開發人員主要是用 Jest 去測試 React 應用,Jest 可以很容易地整合到其它應用程式中充許你使用更獨特的特性在其它地方
- 快照測試是一個非常好用的工具去確保你的應用 UI 不會有超出預期的錯誤在產品釋出替換的期間發生。雖然大部分功能專門設計都是使用在 React 上,但是它也能在其它框架上面如果你能找到合適的外掛
- 不像在這列表上其它的庫,Jest 有著很廣闊的 API ,除非你真的需要一些額外的功能需求,不然不需要你匯入額外的庫
隨著他們的每一次更新Jest 繼續大幅改進功能
我對 Jest 的看法
在全域性變數是一個缺點,Jest 是一個不斷髮展功能強大的庫。它有很多易於理解的文件幫助學習,並且支援各種不同環境,當構建專案的時候這些環境都顯示很棒。
我應該選那一個 JavaScript 單元測試框架?
在我研究了一些不同的框架之後,我得出一個結論,框架並非都是非黑即白的。
大部分框架最終都會(Mocha 除外)在一天結束的時候提供給你你所需要的東西,這是一個測試環境同確保給出的 X -> Y 總回被返回的機制,有幾個會簡單的會給你更多 “華而不實的東西。”
你在選擇他們的時候你自己應該充滿自信,而我的選擇取決於你和你特定專案想要的和需要的。
- 如果你要求有一個廣泛的 API 和特定 (可能獨一無二) 的功能那麼 Mocha 可能會是你的選擇 因為可擴充套件性就在那裡
- AVA 或者 Tape 會給你最低的環境要求。非常好地為你提供一個堅實的最基礎環境讓你能快速開展測試
- 如果你有一個大專案, 或者想快速開始不需要太多配置,那麼 Jest 將會是一個很好的選擇
我希望這將在你選擇你的 JavaScript 單元測試框架時有所幫助。如果你希望我還看一下其它 JavaScript 單元測試框,在評論中讓我知道!我會將它們稍後加到列表中。
掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 Android、iOS、前端、後端、區塊鏈、產品、設計、人工智慧等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃、官方微博、知乎專欄。