PHPUnit 自動化測試大作戰【CH23】

更新於 發佈於 閱讀時間約 12 分鐘

今天我們來聊聊覆蓋率報告吧!

何為覆蓋率報告 & 為何需要覆蓋率報告

所謂的覆蓋率報告,指的是能指出我們的專案程式庫,有被測試程式碼實際測試到的部分的佔比有多少。當我們了解有多少程式碼有被覆蓋到,以及有多少程式碼沒被覆蓋到時,理論上我們可以對程式碼是否可正常運作更有信心!

事前準備

  • 先將以 Laradock 啟動的各 Docker 容器關閉:
# Laradock 目錄下

docker-compose down
  • 將 Laradock 目錄下的 php-fpm 資料夾下的 Dockerfile,尋找 # Check PHP version: 字樣,在其上方加入以下幾行:
# 上略

# Add following commmands

RUN pecl install xdebugRUN docker-php-ext-enable xdebug# End of adding commands

###########################################################################

# Check PHP version:

###########################################################################
  • 啟動 PHP-FPM 容器:
docker-compose up -d php-fpm
  • 進入 PHP-FPM 容器:
docker exec -it laradock-php-fpm-1 bash

測試覆蓋率報告產製

測試覆蓋率報告主要有2種產製方式,一種是純文字輸出於終端機上,一種是輸出 HTML 檔,以下我們就分別測試看看:

純文字輸出

  • 在 PHP-FPM 容器內,輸入以下指令:
XDEBUG_MODE=coverage ./vendor/bin/phpunit --coverage-text
  • 輸出範例:
PHPUnit 9.5.24 #StandWithUkraine

........... 11 / 11 (100%)

Time: 00:00.321, Memory: 14.00 MB

OK (11 tests, 48 assertions)


Code Coverage Report:
2022-10-07 06:28:48

Summary:
Classes: 0.00% (0/11)
Methods: 0.00% (0/12)
Lines: 6.45% (2/31)

App\Console\Kernel
Methods: 0.00% ( 0/ 1) Lines: 0.00% ( 0/ 2)
App\Exceptions\Handler
Methods: 0.00% ( 0/ 1) Lines: 0.00% ( 0/ 1)
App\Http\Controllers\Controller
Methods: ( 0/ 0) Lines: ( 0/ 0)
App\Http\Kernel
Methods: ( 0/ 0) Lines: ( 0/ 0)
App\Http\Middleware\Authenticate
Methods: 0.00% ( 0/ 1) Lines: 0.00% ( 0/ 2)
App\Http\Middleware\EncryptCookies
Methods: ( 0/ 0) Lines: ( 0/ 0)
App\Http\Middleware\ForbidLoginDuringLunch
Methods: 0.00% ( 0/ 1) Lines: 0.00% ( 0/ 4)
App\Http\Middleware\PreventRequestsDuringMaintenance
Methods: ( 0/ 0) Lines: ( 0/ 0)
App\Http\Middleware\RedirectIfAuthenticated
Methods: 0.00% ( 0/ 1) Lines: 0.00% ( 0/ 5)
App\Http\Middleware\TrimStrings
Methods: ( 0/ 0) Lines: ( 0/ 0)
App\Http\Middleware\TrustHosts
Methods: 0.00% ( 0/ 1) Lines: 0.00% ( 0/ 1)
App\Http\Middleware\TrustProxies
Methods: ( 0/ 0) Lines: ( 0/ 0)
App\Http\Middleware\ValidateSignature
Methods: ( 0/ 0) Lines: ( 0/ 0)
App\Http\Middleware\VerifyCsrfToken
Methods: ( 0/ 0) Lines: ( 0/ 0)
App\Models\User
Methods: ( 0/ 0) Lines: ( 0/ 0)
App\Providers\AppServiceProvider
Methods: ( 0/ 0) Lines: ( 0/ 0)
App\Providers\AuthServiceProvider
Methods: 0.00% ( 0/ 1) Lines: 0.00% ( 0/ 1)
App\Providers\BroadcastServiceProvider
Methods: 0.00% ( 0/ 1) Lines: 0.00% ( 0/ 2)
App\Providers\EventServiceProvider
Methods: 0.00% ( 0/ 1) Lines: 0.00% ( 0/ 1)
App\Providers\RouteServiceProvider
Methods: 0.00% ( 0/ 2) Lines: 0.00% ( 0/ 9)
App\Services\TestService
Methods: 0.00% ( 0/ 1) Lines: 66.67% ( 2/ 3) 11 / 11 (100%)Time: 00:00.321, Memory: 14.00 MBOK (11 tests, 48 assertions)Code Coverage Report: 2022-10-07 06:28:48 Summary: Classes: 0.00% (0/11) Methods: 0.00% (0/12) Lines: 6.45% (2/31)App\Console\Kernel Methods: 0.00% ( 0/ 1) Lines: 0.00% ( 0/ 2)App\Exceptions\Handler Methods: 0.00% ( 0/ 1) Lines: 0.00% ( 0/ 1)App\Http\Controllers\Controller Methods: ( 0/ 0) Lines: ( 0/ 0)App\Http\Kernel Methods: ( 0/ 0) Lines: ( 0/ 0)App\Http\Middleware\Authenticate Methods: 0.00% ( 0/ 1) Lines: 0.00% ( 0/ 2)App\Http\Middleware\EncryptCookies Methods: ( 0/ 0) Lines: ( 0/ 0)App\Http\Middleware\ForbidLoginDuringLunch Methods: 0.00% ( 0/ 1) Lines: 0.00% ( 0/ 4)App\Http\Middleware\PreventRequestsDuringMaintenance Methods: ( 0/ 0) Lines: ( 0/ 0)App\Http\Middleware\RedirectIfAuthenticated Methods: 0.00% ( 0/ 1) Lines: 0.00% ( 0/ 5)App\Http\Middleware\TrimStrings Methods: ( 0/ 0) Lines: ( 0/ 0)App\Http\Middleware\TrustHosts Methods: 0.00% ( 0/ 1) Lines: 0.00% ( 0/ 1)App\Http\Middleware\TrustProxies Methods: ( 0/ 0) Lines: ( 0/ 0)App\Http\Middleware\ValidateSignature Methods: ( 0/ 0) Lines: ( 0/ 0)App\Http\Middleware\VerifyCsrfToken Methods: ( 0/ 0) Lines: ( 0/ 0)App\Models\User Methods: ( 0/ 0) Lines: ( 0/ 0)App\Providers\AppServiceProvider Methods: ( 0/ 0) Lines: ( 0/ 0)App\Providers\AuthServiceProvider Methods: 0.00% ( 0/ 1) Lines: 0.00% ( 0/ 1)App\Providers\BroadcastServiceProvider Methods: 0.00% ( 0/ 1) Lines: 0.00% ( 0/ 2)App\Providers\EventServiceProvider Methods: 0.00% ( 0/ 1) Lines: 0.00% ( 0/ 1)App\Providers\RouteServiceProvider Methods: 0.00% ( 0/ 2) Lines: 0.00% ( 0/ 9)App\Services\TestService Methods: 0.00% ( 0/ 1) Lines: 66.67% ( 2/ 3)
  • 說明:首先可以看到 Summary 的地方,這邊會顯示3種覆蓋率:ClassesMethodsLines,前2者都是要將單一 Class/Method 內每一行可執行程式碼都有被測試程式碼覆蓋到,才會計算在內,而 Lines 就單純多了,就是有幾行可執行程式碼有被測試程式碼覆蓋到。

輸出HTML檔

  • 在 PHP-FPM 容器內,輸入以下指令:
XDEBUG_MODE=coverage ./vendor/bin/phpunit --coverage-html report/
  • 輸出範例:
  • 說明:HTML檔會好看得多,從輸出範例1上可以一目了然,各資料夾的各類覆蓋率是多少。除此之外,從輸出範例2可知還可以單看某一個檔案的覆蓋率。

以上就是今天的介紹,大家是不是更了解測試覆蓋率了呢?

之後的篇幅,讓我們來演練一些情境題吧!

如果您喜歡這篇文章,歡迎加入追蹤以接收新文章通知 😄

參考資料

本系列文章目錄

avatar-img
8會員
357內容數
歡迎來到 WilliamP 的沙龍天地,在這裡將與各位讀者探討各種主題,包刮高中數學題庫、PHP開發經驗、LINE聊天機器人開發經驗、書摘筆記等,歡迎交流!
留言
avatar-img
留言分享你的想法!

































































WilliamP的沙龍 的其他內容
今天讓我們來看 phpunit.xml 吧! phpunit.xml 位在 Laravel 專案根目錄底下,顧名思義,它是一個設定 PHPUnit 執行方式的設定XML檔,PHPUnit 提供了不少設定值可供設定,這邊只提最重要的幾個: stopOnFailure 說明:當此欄位設定為 tru
今天要來為大家介紹 Storage Mocking 及 HTTP Mocking! Storage Mocking 函數 Storage::fake():當我們希望在執行測試目標行為時,想驗證 Storage 各類行為是否符合預期,但又不要真的增刪改檔案時,可在測試程式碼中呼叫此函數。 Upl
今天來看 Queue Mocking 吧! Queue Mocking 函數 Queue::fake():當我們希望在執行測試目標行為時,想驗證某個 Job 類別是否有被派送至佇列中,但又不要真的觸發 Job 入列時,可在測試程式碼中呼叫此函數。 Queue::assertPushed():可
今天來看 Mail Mocking 吧! Mail Mocking 函數 Mail::fake():當我們希望在執行測試目標行為時, 想驗證是否有觸發到發送 Email ,但又不要真的觸發 Email 的寄送時,可在測試程式碼中呼叫此函數。 Mail::assertSent():可驗證指定的
今天我們會接續環繞著 「Mocking」 這個主題。 在 Laravel 中,有幾個類別的 Mocking 方式,與前兩天所介紹的方式有所不同,在這次的系列文章中,會和大家介紹 Event、Mail、Queue、Storage、HTTP 這幾個類別的特殊 Mocking 方式。 今天就先來看 E
今天讓我們回顧一下前一天的 Mocking 初體驗吧! Mocking 初體驗回顧 app/Repositories/UserRepository.php <?php namespace App\Repositories; use App\Models\User; class UserR
今天讓我們來看 phpunit.xml 吧! phpunit.xml 位在 Laravel 專案根目錄底下,顧名思義,它是一個設定 PHPUnit 執行方式的設定XML檔,PHPUnit 提供了不少設定值可供設定,這邊只提最重要的幾個: stopOnFailure 說明:當此欄位設定為 tru
今天要來為大家介紹 Storage Mocking 及 HTTP Mocking! Storage Mocking 函數 Storage::fake():當我們希望在執行測試目標行為時,想驗證 Storage 各類行為是否符合預期,但又不要真的增刪改檔案時,可在測試程式碼中呼叫此函數。 Upl
今天來看 Queue Mocking 吧! Queue Mocking 函數 Queue::fake():當我們希望在執行測試目標行為時,想驗證某個 Job 類別是否有被派送至佇列中,但又不要真的觸發 Job 入列時,可在測試程式碼中呼叫此函數。 Queue::assertPushed():可
今天來看 Mail Mocking 吧! Mail Mocking 函數 Mail::fake():當我們希望在執行測試目標行為時, 想驗證是否有觸發到發送 Email ,但又不要真的觸發 Email 的寄送時,可在測試程式碼中呼叫此函數。 Mail::assertSent():可驗證指定的
今天我們會接續環繞著 「Mocking」 這個主題。 在 Laravel 中,有幾個類別的 Mocking 方式,與前兩天所介紹的方式有所不同,在這次的系列文章中,會和大家介紹 Event、Mail、Queue、Storage、HTTP 這幾個類別的特殊 Mocking 方式。 今天就先來看 E
今天讓我們回顧一下前一天的 Mocking 初體驗吧! Mocking 初體驗回顧 app/Repositories/UserRepository.php <?php namespace App\Repositories; use App\Models\User; class UserR
你可能也想看
Google News 追蹤
Thumbnail
Code Coverage 是什麼? 程式碼覆蓋率(Code Coverage)是一種軟體測試指標,用百分比表示,數值越高越好。
Thumbnail
這篇文章闡述了定量評估內容領域是否容易變現的重要性,並提出了觀眾痛點強度測試、市場是否成長測試、人類慾望測試、真實盈利證明以及主題壽命測試等五大綱要。
測試網站和應用程式時需要注意以下事項和執行以下工作: 注意事項: 跨平台相容性: 確保網站或應用程式在各種瀏覽器和設備上的相容性,包括桌面、平板和手機等。 響應式設計測試: 測試網站或應用程式在不同螢幕尺寸和解析度下的表現,確保響應式設計正常運作。 安全性測試: 確保網站或應用程式的安全性,
Thumbnail
接續上一篇,繼續來講如何從常態分布的機率進行假設檢定,進而推論母體的平均數吧! 這篇會提到否證的邏輯、魔法數字0.5以及統計檢定到底是什麼這三個主題。
Thumbnail
關於完讀率還有後台的數據等🤔 如同我留言的,我也不知道這些數據是怎麼統計出來的,我是覺得如果想要增加瀏覽率、按讚數等,就要花時間心力去經營、宣傳,增加曝光能見度,很多大明星一開始也是默默無名的小咖😅 我還是會以目前的步調,一天一篇小短文(連載)和一篇瞎聊為主囉。(基本、通常、應該、可能、
Thumbnail
這是一篇很精彩的測試文章喔!
Thumbnail
Code Coverage 是什麼? 程式碼覆蓋率(Code Coverage)是一種軟體測試指標,用百分比表示,數值越高越好。
Thumbnail
這篇文章闡述了定量評估內容領域是否容易變現的重要性,並提出了觀眾痛點強度測試、市場是否成長測試、人類慾望測試、真實盈利證明以及主題壽命測試等五大綱要。
測試網站和應用程式時需要注意以下事項和執行以下工作: 注意事項: 跨平台相容性: 確保網站或應用程式在各種瀏覽器和設備上的相容性,包括桌面、平板和手機等。 響應式設計測試: 測試網站或應用程式在不同螢幕尺寸和解析度下的表現,確保響應式設計正常運作。 安全性測試: 確保網站或應用程式的安全性,
Thumbnail
接續上一篇,繼續來講如何從常態分布的機率進行假設檢定,進而推論母體的平均數吧! 這篇會提到否證的邏輯、魔法數字0.5以及統計檢定到底是什麼這三個主題。
Thumbnail
關於完讀率還有後台的數據等🤔 如同我留言的,我也不知道這些數據是怎麼統計出來的,我是覺得如果想要增加瀏覽率、按讚數等,就要花時間心力去經營、宣傳,增加曝光能見度,很多大明星一開始也是默默無名的小咖😅 我還是會以目前的步調,一天一篇小短文(連載)和一篇瞎聊為主囉。(基本、通常、應該、可能、
Thumbnail
這是一篇很精彩的測試文章喔!