Day 18 的單元測試介紹,提供了如何使用 PHPUnit,其中提到了「覆蓋率」,指的是在測試過程中,執行過的行數,佔專案原始碼中總行數的比率和程度。

在 PHPUnit 中啟用輸出程式碼覆蓋率報表的功能,需要安裝 XDebug 這個 PHP 擴充套件。

查看是否已安裝 XDebug

使用 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 是一個提供覆蓋率分析報表的線上服務,它對於公開的開放原始碼專案是完全免費的。

如何使用?

  • 首先,註冊帳號使用 GitHub 帳號登入以連結你的儲存庫列列表。
  • 再來,修改 GitHub Action 的設定 YAML 檔案。

在昨天 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 的規範會比較好。這個建議一直在我腦海裡迴蕩不去,最後花了幾個月晚上下班的時間完成整個改寫。整個架構更動非常大,順利改版靠的是單元測試及測試覆蓋率的輔助。

本篇進度的程式碼
鐵人賽而生的專案程式碼

配合鐵人賽而生的專案程式碼會隨時修改,不一定會和本篇文章一樣。如看範例,請見本篇進度的程式碼。

希望今天的介紹對大家有幫助喔。我們明天見。

最後修改日期: 2022-03-18

作者

留言

撰寫回覆或留言

發佈留言必須填寫的電子郵件地址不會公開。