代碼覆蓋率測試及 GitHub 自動化集成
本文對應項目為 learn-coverage-test,可以對照項目案例進行閱讀。
覆蓋率測試
在寫代碼的時候,我們有時候會進行代碼測試以保證我們代碼的可執行性。但是測試代碼只能保證測試案例能夠通過,我們怎麽樣才能確保我們的測試案例基本覆蓋了所有的情況呢?
比如:
const a = true;
if (a) {
return 1;
} else {
return -1;
}
上面這段代碼只能確保 a === true
的情況被執行,而沒有執行 a === false
的情況。如果在實際使用當中,a 的值為 false,那麽上面的代碼可能會發生不可預知的情況。
所以我們需要引入覆蓋率測試對我們的測試案例進行評估。
覆蓋率用於評估在代碼測試的過程中,所測試的代碼的比例和程度。通常而言,測試覆蓋率高的代碼出錯的幾率比較小;測試覆蓋率較低的代碼出現不可預知行為的幾率比較大。
覆蓋率測試的分類
根據維基百科的資料,基本的代碼覆蓋率有 4 種:函數覆蓋率
、語句覆蓋率
、分支覆蓋率
和條件覆蓋率
。
其中:
- 函數覆蓋率:程序中的函數占函數總量的比重
- 語句覆蓋率:執行代碼行數占代碼總行數的比重
- 分支覆蓋率:表示代碼邏輯的每個分支是否都測試了,比如 if 條件為 true 或者 false 時的代碼是否都被執行了
- 條件覆蓋率:每個布爾子表達式都應該被賦值為了 true 或者 false,這樣才滿足條件覆蓋率測試。
比如現在有一個函數:
function foo(x, y) {
let res = 0;
if (x > 0 && y > 0) {
res = x;
}
return res;
}
對於上面這個函數,我們在測試時:
- 如果 foo 函數被執行了,那麽該函數的函數覆蓋率被滿足。當源代碼只包含這一個函數時,函數覆蓋率為 100%。比如:
foo(1, 2)
- 如果函數的每一行代碼(每一條語句)都被執行了,那麽該函數的語句覆蓋率被滿足。比如:
foo(1, 2)
,因為res = x
也被執行了。 - 如果 if 內的代碼也被執行了,那麽條件覆蓋率被滿足。
- 如果測試案例中包含
x > 0
y > 0
為 true 和 false 的情況,那麽條件覆蓋率被滿足。比如:foo(1, -1)
和foo(-1, 1)
。
以上案例來自維基百科
使用 Mocha + Istanbul 測試覆蓋率
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
可以看到詳細的覆蓋率測試結果:
整合 Codecov 和 TravisCI 進行覆蓋率自動化測試
首先要對你的 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 Badge
在 Codecov 官網登錄後找到你的 repo,然後點擊進去,依次找到 Settings -> Badge,復制對應的代碼即可。
效果參考 https://github.com/zhongdeming428/learn-coverage-test。
代碼覆蓋率測試及 GitHub 自動化集成