代碼覆蓋率測試及 GitHub 自動化集成

codecov

本文對應項目爲 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

其中:函數

  • 函數覆蓋率:程序中的函數佔函數總量的比重
  • 語句覆蓋率:執行代碼行數佔代碼總行數的比重
  • 分支覆蓋率:表示代碼邏輯的每一個分支是否都測試了,好比 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 的值爲 true 和 false 的狀況,以及 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 目錄下。

捕獲1.png

點擊 coverage/index.html 能夠看到詳細的覆蓋率測試結果:

捕獲2.png

整合 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 中:

捕獲3.png

若是 Contributor 沒有對新增代碼寫對應的測試案例,你就能夠一眼看出來。若是測試覆蓋率過低,你能夠修改 PR,從新合併。

我在 PR 中修改了測試代碼,提升了測試覆蓋率,Codecov 在我合併 PR 以前就已經把覆蓋率報告評論在了 PR 下方了,能夠明顯地看到覆蓋率獲得了提高,確實十分的方便。

捕獲4.png

添加 Codecov Badge

在 Codecov 官網登陸後找到你的 repo,而後點擊進去,依次找到 Settings -> Badge,複製對應的代碼便可。

效果參考 https://github.com/zhongdeming428/learn-coverage-test

相關文章
相關標籤/搜索