測試的工具怎麼分類?
前言
開始練習寫測試的時候,再學會語法之前常常就被一堆的工具搞混,像是Jest、Mocha、Karma……等,這篇文章來簡單聊聊這些工具的功用及分類
隨意說說Unit Test
單元測試專注在單一區塊程式碼,可能是function、Object、Module,在JS中主要以function為主,透過傳入的參數或設定外部變數來確認這個function的回傳為預期的結果
舉個例子:假如今天在電商網站中,實作一個確認商品沒有過期的Function
1 | function isExpire(expireDate){ |
當傳入的expireDate參數比今天日期小時,代表商品已經過期必須要回傳false,因此測試可能寫成這樣
1 | if (isExpire('3000/4/4')){ |
但是這樣寫不但需要自己管理測試程式,呈現的結果也很糟糕,這時候就可以使用一些測試工具摟
工具分類
測試工具通常可以分為四類,這不是絕對!不過可以思考這樣分類的意義
- Test Runner
- Testing Framework
- Assertion Libraries
- Testing Plugins
Test Runner
提供環境給測試工具在其中運行,並且將處理結果輸出到Log、File、Console……等
Karma是個標準的Test Runner,他會產生一個網頁伺服器,針對不同瀏覽器跑你寫的Unit Test,並將結果輸出到console,告訴你哪些測試是pass哪些是fail
當你要測的程式碼本身需要跑在瀏覽器時
,像是操作網頁的DOM或是測試一些前端framework的畫面邏輯,你就可以使用Karma
,因為通常Unit Test會寫在.js檔並用Node.js去跑,而Node.js只是一個跑在伺服器端環境的JavaScript,所以想要在伺服器端運行瀏覽器端的程式碼就得靠它了
註:這邊指的伺服器端只是代表他沒有在browser端
,並不是一定要開個Http Server才能寫Node.js
Testing Framework
提供一個寫測試的規則,讓你照著那個準則就可以很方便的撰寫及管理測試程式碼(根本只是在講framwork是什麼東西吧),那我們來舉個實例
如果使用了mocha剛剛的範例就會如下
1 | describe('isExpier', () => { |
可以看到多了describe及it,這就是mocha提供的規則,讓我們能比較方便對Unit Test 進行分類,對於Test Runner執行後的結果也能整理成漂亮的報表來呈現
但是依舊要寫If-Else好煩啊!!還要寫那麼長,這時候Assertion Libraries(斷言庫)就可以派上用場拉!
Assertion Libraries
斷言可以替Unit Test省下冗長的If-Else,除此之外還可以增加程式碼的可讀性
我們使用Chai再將剛剛的例子修改一下
1 | describe('isExpire', () => { |
是不是就簡單多了?
註:斷言寫法有分為TDD style, BDD style,上面範例為BDD style,這又可追溯到開發原理TDD與BDD,不過本篇暫時不討論
Testing Plugins
基本上使用Test Runner、Test Framework、Assertion Libaraies就可以寫好測試了,不過試想有時為了測試某個功能,而特地開了API、Server、Database……等,是不是太麻煩了?或是為了測試異步的function,而使得測試過程為了等待回應而降低了測試的效益,像是Ajax Call,這時就可以使用一些Plugins,來幫助我們解決類似問題。
結論
- Karma是Test Runner
- Mocha是Testing Framework
- Chai是Assertion Libaraies
- Sinon主要是Testing Plugins,並自帶Aserrtion Libaraies
- Jest主要是Testing Framework,並且有Assertion Libaraies + Testing Plugins
Jest好棒棒
資料來源
本篇文章的工具四種分類為參考amzotti想法,並加上自己的觀點