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會員
233內容數
歡迎來到 WilliamP 的沙龍天地,在這裡將與各位讀者探討各種主題,包刮高中數學題庫、PHP開發經驗、LINE聊天機器人開發經驗、書摘筆記等,歡迎交流!
留言0
查看全部
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
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
練習 PHPUnit 測試的撰寫,依序創建Controller、Service,並針對計算邏輯進行單元測試的練習。
Thumbnail
在 Laravel 中的測試中,PHPUnit 和 Mockery 都可以用來創建測試替身(test double),但它們有不同的方式和功能,以下簡單介紹兩種寫法方式。
前言 基本準備差不多了,也能跑自己的測試,再來就是關於測試腳本的核心:元素定位跟動作,本篇會著重介紹 XPATH 定位的部分
Thumbnail
前言 上篇我們成功執行第一個測試案例,從 Python 腳本透過 Appium 控制模擬器點選設定中的電池,下個問題就是怎麼找元件,這時候就要請出 Appium Inspector 了
前言 經過五個小單元的準備,終於可以開始跑第一個測試了,Appium 本身是個工具,可以搭配各種語言,這邊選擇 Python 作為測試腳本語言,以便之後跟 Robot Framework 串接。
前言 前四篇,把主機作業系統跟待測物準備交代完畢,有需要請自行跳轉取用,接下來就是測試工具的部分,這次測試套件使用大名鼎鼎 Appium 2。 選擇 Appium 2 的理由 歷史悠久:Appium 2012 年公開之後,就廣受測試社群愛戴 站在巨人的肩榜上:架構類似 Selenium的主從式架構,
前言 前幾篇聊到作業系統、Docker 跟 Android 容器的準備,再來就是替 Android 容器開啟 Google Play 套件並安裝待測 App 供後續手動或者自動測試使用。
前言 前兩篇把作業系統跟 Docker 安裝講完了,接下來就是 Android 容器的安裝了,這裡選用 ReDroid ,因為它是開源、高效、又便於管理的方案。
Thumbnail
前言 前篇把 Ubuntu 作業系統的安裝跟準備談完了,有需要可以跳回去看。接下來聊容器服務 Docker 的安裝與使用。 Docker 可以應用的場合很多,這次是會用它來模擬 Android 受測裝置
前言 本 App 自動化測試專題,用來記錄自動化 App 測試的各環節,包含環境準備、套件安裝、腳本編寫、執行測試與整合。
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
練習 PHPUnit 測試的撰寫,依序創建Controller、Service,並針對計算邏輯進行單元測試的練習。
Thumbnail
在 Laravel 中的測試中,PHPUnit 和 Mockery 都可以用來創建測試替身(test double),但它們有不同的方式和功能,以下簡單介紹兩種寫法方式。
前言 基本準備差不多了,也能跑自己的測試,再來就是關於測試腳本的核心:元素定位跟動作,本篇會著重介紹 XPATH 定位的部分
Thumbnail
前言 上篇我們成功執行第一個測試案例,從 Python 腳本透過 Appium 控制模擬器點選設定中的電池,下個問題就是怎麼找元件,這時候就要請出 Appium Inspector 了
前言 經過五個小單元的準備,終於可以開始跑第一個測試了,Appium 本身是個工具,可以搭配各種語言,這邊選擇 Python 作為測試腳本語言,以便之後跟 Robot Framework 串接。
前言 前四篇,把主機作業系統跟待測物準備交代完畢,有需要請自行跳轉取用,接下來就是測試工具的部分,這次測試套件使用大名鼎鼎 Appium 2。 選擇 Appium 2 的理由 歷史悠久:Appium 2012 年公開之後,就廣受測試社群愛戴 站在巨人的肩榜上:架構類似 Selenium的主從式架構,
前言 前幾篇聊到作業系統、Docker 跟 Android 容器的準備,再來就是替 Android 容器開啟 Google Play 套件並安裝待測 App 供後續手動或者自動測試使用。
前言 前兩篇把作業系統跟 Docker 安裝講完了,接下來就是 Android 容器的安裝了,這裡選用 ReDroid ,因為它是開源、高效、又便於管理的方案。
Thumbnail
前言 前篇把 Ubuntu 作業系統的安裝跟準備談完了,有需要可以跳回去看。接下來聊容器服務 Docker 的安裝與使用。 Docker 可以應用的場合很多,這次是會用它來模擬 Android 受測裝置
前言 本 App 自動化測試專題,用來記錄自動化 App 測試的各環節,包含環境準備、套件安裝、腳本編寫、執行測試與整合。