在 Day 18 的單元測試介紹,提供了如何使用 PHPUnit,其中提到了「覆蓋率」,指的是在測試過程中,執行過的行數,佔專案原始碼中總行數的比率和程度。
在 PHPUnit 中啟用輸出程式碼覆蓋率報表的功能,需要安裝 XDebug 這個 PHP 擴充套件。
php -m
指令會列出所有已安裝的 PHP 擴充套件。可加 grep
指令尋找字串。
phpinfo()
(圖:phpinfo() 輸出的資訊)
指令或者 phpinfo()
在網頁上印出目前 PHP 套件資訊,確認 XDebug 是否已安裝。
先來實際測試一下,看看目前的覆蓋率如何。
結果的訊息顯示:
Generating code coverage report in Clover XML format ... done
Generating code coverage report in HTML format ... done
表示已產生測試程式碼覆蓋率的報表唷!
報表的位置就如下圖 phpunit.xml
的第 18-21 行的設定。
coverage.xml
是覆蓋率資料。記錄各行數執行過的次數。tests/report
是放置視覺化的網頁報表的位置。這兩個檔案及路徑是測試產生資料,記得從版控中排除。
筆者將這次的測試結果產生的覆蓋率報表上傳,可直接查看。
總行數 240 裡測試過 192 行,測試程式碼覆蓋率 80.00%。
在單元測試的流程中,已經可以產生報表了,那麼這些報表該如何上網,提供給其它開發者參考呢?在這裡筆者推薦 codecov.io
。
(圖:codecov.io 官網)
Codecov 是一個提供覆蓋率分析報表的線上服務,它對於公開的開放原始碼專案是完全免費的。
在昨天 Day 21 筆者提到的 YAML 設定檔,只要加入短短的四行,就啟用了。
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v1
with:
file: ./coverage.xml
線上報表網址:
才剛啟用 Codecov 的服務,接下來隨著日子的過去,還會有覆蓋率變化的曲線圖。
每個類別、每個目錄的統計。
清楚的顯示每一個執行的次數。還有沒執行到的部分。這表示還需要寫其它的測試來讓沒執行過的行數至少執行過一次,才能提升覆蓋率。
接下來別忘記把顯示覆蓋率的徽章貼到 README 上。其它開發者看到你的作品越多品質相關的資訊,信任感會越高。
程式碼的覆蓋率非常重要,如果沒達到 100%,則可能存在著本應該測到,但沒測到的 Bug。當整個套件的邏輯寫好,測試程式碼覆蓋率達到 100% 的話,就算專案要大幅度改寫,也能藉由已經確定的邏輯不變的測試來輔助,讓改版作業完成。
筆者的專案 Shieldon Firewall 從 v1 改版成 v2,就是在測試不動的情況下整個改寫程式碼。
版本 | 分支 |
---|---|
v1 | https://github.com/terrylinooo/shieldon/tree/1.x |
v2 | https://github.com/terrylinooo/shieldon/tree/2.x |
當初改版的原因是其它開發者建議我依循 PSR-7 的規範會比較好。這個建議一直在我腦海裡迴蕩不去,最後花了幾個月晚上下班的時間完成整個改寫。整個架構更動非常大,順利改版靠的是單元測試及測試覆蓋率的輔助。
配合鐵人賽而生的專案程式碼會隨時修改,不一定會和本篇文章一樣。如看範例,請見本篇進度的程式碼。
希望今天的介紹對大家有幫助喔。我們明天見。
本文同步更新於 TerryL 部落格 PHP 套件設計實戰 (8) 程式碼覆蓋率 (Code Coverage),歡迎前往討論。