本文對應項目爲 learn-coverage-test,能夠對照項目案例進行閱讀。html
在寫代碼的時候,咱們有時候會進行代碼測試以保證咱們代碼的可執行性。可是測試代碼只能保證測試案例可以經過,咱們怎麼樣才能確保咱們的測試案例基本覆蓋了全部的狀況呢?node
好比:git
const a = true;
if (a) {
return 1;
} else {
return -1;
}
複製代碼
上面這段代碼只能確保 a === true
的狀況被執行,而沒有執行 a === false
的狀況。若是在實際使用當中,a 的值爲 false,那麼上面的代碼可能會發生不可預知的狀況。github
因此咱們須要引入覆蓋率測試對咱們的測試案例進行評估。npm
覆蓋率用於評估在代碼測試的過程當中,所測試的代碼的比例和程度。一般而言,測試覆蓋率高的代碼出錯的概率比較小;測試覆蓋率較低的代碼出現不可預知行爲的概率比較大。json
根據維基百科的資料,基本的代碼覆蓋率有 4 種:函數覆蓋率
、語句覆蓋率
、分支覆蓋率
和條件覆蓋率
。bash
其中:函數
好比如今有一個函數:工具
function foo(x, y) {
let res = 0;
if (x > 0 && y > 0) {
res = x;
}
return res;
}
複製代碼
對於上面這個函數,咱們在測試時:測試
foo(1, 2)
foo(1, 2)
,由於 res = x
也被執行了。x > 0
的值爲 true 和 false 的狀況,以及 y > 0
爲 true 和 false 的狀況,那麼條件覆蓋率被知足。好比:foo(1, -1)
和 foo(-1, 1)
。以上案例來自維基百科
Mocha 是 JavaScript 項目的測試工具,Istanbul 是 JS 測試覆蓋率報告的生成工具。
該節介紹如何結合兩者測試代碼並生成代碼測試覆蓋率報告。
nyc 是 Istanbul 的命令行接口,咱們將其做爲開發依賴安裝在項目中:
$ npm i -D nyc
複製代碼
而後在咱們的 package.json
文件的 scripts
對象中新增以下屬性:
"coverage": "node_modules/.bin/nyc --reporter=html --reporter=text node_modules/mocha/bin/_mocha"
複製代碼
固然,根據項目狀況不一樣,上面的命令能夠不一致,具體能夠參考文檔進行配置。
這樣當你在 npm run test
以後就能夠在測試結果以後看到輸出的覆蓋率報告,並且還會額外生成覆蓋率報告頁面文件到項目的 coverage 目錄下。
點擊 coverage/index.html
能夠看到詳細的覆蓋率測試結果:
首先要對你的 GitHub 帳號開通 Codecov 權限,訪問 Codecov,而後使用 GitHub 帳號登陸。以後將會自動同步一些你的 GitHub 信息,按照指引進行便可。
此後還須要在 GitHub 進行設置,對某個 repo 開通 Codecov 的服務。具體能夠在 GitHub marketplace 中找到 Codecov,而後點擊 configure 進行配置。
Travis CI 腳本中須要添加幾句命令,以便安裝對應依賴和上傳覆蓋率報告。
.travis.yml
具體配置大約以下:
language: node_js
node_js:
- "7"
install:
- npm i
- npm i -g codecov
script:
- npm run coverage
- node_modules/.bin/nyc report --reporter=text-lcov > coverage.lcov - codecov cache:
directories:
- node_modules
複製代碼
能夠看到安裝的依賴爲 codecov,而且是全局安裝。而後使用 node_modules/.bin/nyc report --reporter=text-lcov > coverage.lcov
命令生成了報告。
配置好以後,當你每次對項目進行 PR 的時候,Codecov 會自動測試覆蓋率,而後將報告評論在 PR 中:
若是 Contributor 沒有對新增代碼寫對應的測試案例,你就能夠一眼看出來。若是測試覆蓋率過低,你能夠修改 PR,從新合併。
我在 PR 中修改了測試代碼,提升了測試覆蓋率,Codecov 在我合併 PR 以前就已經把覆蓋率報告評論在了 PR 下方了,能夠明顯地看到覆蓋率獲得了提高,確實十分的方便。
在 Codecov 官網登陸後找到你的 repo,而後點擊進去,依次找到 Settings -> Badge,複製對應的代碼便可。