1. 程式人生 > >代碼覆蓋率測試及 GitHub 自動化集成

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

master asc 測試案例 這一 scrip 通過 json 情況 ref

技術分享圖片

本文對應項目為 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
    的值為 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 目錄下。

技術分享圖片

點擊 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 自動化集成