一次看懂 Jest 覆蓋率報告
Opened this issue · 0 comments
一次看懂 Jest 覆蓋率報告
在談單元測試的時候常常會談到一個關鍵性的名詞: 覆蓋率(coverage),
雖然很多時候覆蓋率並不是一個好的指標來衡量你的測試品質,但在客觀的情況下就是會問你覆蓋率到多少。
所以今天我讓我們來研究一下這個東西吧!
不過在那之前要先講一下怎麼開啟產生覆蓋率報告
1. 開啟產生覆蓋率報告的選項
以 Vue + Jest 為例
有找到這裡 說明如何開啟
通常是把以下的設定寫進 jest.config.js 或是 package.json (還需要稍作修改) 裡面就可以了
module.exports = {
moduleFileExtensions: ['js', 'json', 'vue'],
transform: {
'^.+\\.js$': 'babel-jest',
'^.+\\.vue$': 'vue-jest'
},
collectCoverage: true,
collectCoverageFrom: ['src/**/*.{js,vue}', '!src/main.js']
}
2. 產生報告
再跑一次測試就可以了,以使用 @vue/cli-plugin-unit-jest 來安裝的同學為例,只要再次使用 npm run test:unit
就可以等待報告產生了
3. 打開報告
跑完以後不管是否全部通過還是有部分通過,都會在根目錄下面 coverage
這個資料夾,我們直接進入 coverage/lcov-report 就可以看到報告的 html 檔 index.html
,點兩下打開以後就可以檢視覆蓋率如何
4. 理解報告
簡單解釋一下各項的意思
首先是左上角的文字跟數字
如果是 Statements 10/10 那就表示在這支檔案中的 Statements 的覆蓋率是百分之百
Statements
計算每一個陳述句的覆蓋率,關於 Statement 是甚麼 ?
這裡面的語法都算是 statement
用我自己的理解來解釋的話那就是:
statement 執行一些邏輯,但不會回傳值(value),像下面這種就不是 statement,因為會回傳值
new objectType([param1, param2, ..., paramN]);
你也可以參考這文章
我自己測試的話,會發現很多地方我覺得不是 statements 的地方其實都算是 statement,像是我發現 data
既是 statement 也是 functions 也是 lines (@@?)
data() {
return {
// ...
}
}
Branches
每一個 if ... else 或是 switch case 產生的分支,都會被計算是一次
Functions
就是計算 JS function,在 vue 中常見的 methods 也屬於 functions
Lines
計算每一行的覆蓋
還有一些在報告裡面怪怪的地方,譬如
I: 代表 if 語句沒有成立,判斷式內的語句未執行
E: 代表 else 語句沒有成立,判斷式內的語句未執行
行數左邊的 x 數量: 代表那一行執行次數
如果程式碼被顏色標記的話:
黃色:代表沒有覆蓋的 Branches
粉紅色:未涵蓋的 Statements
總結
這篇文章的主要想傳達幾個重點
- 如何產生報告
- 理解報告中的資訊,當我們了解覆蓋率報告中的資訊是如何計算跟呈現之後,想要提高覆蓋率的時候就知道要往哪個方向努力了