使用jscoverage計算Node.js程式覆蓋率
在之前的文章 使用mocha在Node.js和瀏覽器環境中單元測試 提到如何進行測試,而我們還可以利用工具去進一步計算測試所涵蓋的範圍。
由於之前採用mocha作為測試的Framework,所以這篇文章選擇可以和mocha搭配使用的jscoverage。
在開始之前請先參考之前的文章轉寫好單元測試。
1. 加入jscoverage套件
npm install jscoverage --save-dev
(註:安裝到全域會把別人的函式庫也計算進去,所以採用每個專案都安裝)
2. 設定忽略清單
有些檔案或資料夾我們不想列入計算,我們可以將清單加入忽略,在專案底下建立.covignore檔案,寫入:
/tests/ node_modules/
這個範例將測試程式放在tests而我們不想將它列入計算,所以將該目錄排除,請依據實際情況設定
3. 執行測試
之後我們就可以透過以下指令進行測試並計算覆蓋率
mocha tests/node-test.js -r jscoverage
可以發現就是之前的測試指令多加上-r jscoverage的參數。
同樣的我們也可以把它寫到package.json裡面
"scripts": { "test": "mocha tests/node-test.js -r jscoverage" }
就可以執行以下指令代替
npm test
可以看到多出的覆蓋率資訊。
⁍ Coverage src/md5.js line[100%] branch[100%]
4. 詳細資訊
如果想要看到更完整的報表,可以執行以下指令
mocha tests/node-test.js -r jscoverage --covout=html
會在專案底下多出covreporter的資料夾,開起裡面的index.html網頁可以看到如下資訊
(註: 因為js-md5覆蓋率100%,所以使用其他專案代替以便展示)
紅色部分為測試沒有執行到的部分。
補充資訊
jscoverage會計算line和branch兩種覆蓋率,其中line顧名思義就是有執行到的行數比例,而branch則是有執行到的條件分歧比例,例如:
var n = 1; if(n == 1) { ++n; ++n; ++n; } else { ++n; }
其中有效行數為5行,會進入if中,所以執行行數為4,line的覆蓋率就是80%;而分歧的可能情況為2種,執行到其中一種,所以branch的覆蓋率為50%。
延伸閱讀