Laravel Testing Decoded (導讀) 第三章 PHPUnit 配置

PHPUnit 提供了大量的配置選項,其中許多都不會使用。在本章中,將介紹一些最有用的選項,並建立一個 XML 配置檔來儲存這些設定。

選項

Technicolor(彩色)

雖然黑白也是可以,但建議你在運行測試時啟用彩色輸出,與交通號誌類似,簡單的綠色、紅色輸出可以幫助加快你的開發工作流程,我們對顏色的反應比文字快。

1
phpunit --colors

2017-03-03_00-03-52

2017-03-03_00-04-07

Bootstrapping(引導)

有時你需要在執行測試之前要載入某些檔案,一個完美的例子在執行任何測試之前確保載入 Composer 的 autoload 腳本,雖然可以在每個 Test Class 開頭手動載入,但最好還是利過 PHPUnit 的 bootstrap 設定,如下:

1
phpunit --bootstrap="vendor/autoload.php"

輸出格式

除了預設的測試報告,PHPUnit 還提供兩個選項 –tap 以及 –testdox 。

TAP 是 Test Anything Protocol 的縮寫

1
phpunit --tap tests

2017-03-03_00-08-31

TestDox 格式以稍微不同的方式,它會讀取測試 Methods 名稱,並將依照 camelCase 名稱轉換為可讀的句子,例如 testRedirectsToHomePageOnSave 會轉換為 Redirects To Home Page On Save 。

2017-03-03_00-09-29

這有助於了解哪些測試成功的俯視圖以及提供文件,這是寫測試的一個優點:免費文件。

XML 配置檔

如果你以為每次使用 PHPUnit 都要輸入這麼多選項,那麼你錯了,並不需要這樣:

1
phpunit --bootstrap="vendor/autoload.php" --testdox --colors tests

相反的,利用 PHPUnit 讀取配置檔的功能,讓我們回顧一下最簡單的例子,在專案的根目錄中,建立一個 phpunit.xml 的檔案並輸入:

1
<phpunit colors="true"></phpunit>

使用這句,就可以不需要在執行測試時使用 –colors 這個 tag ,讓我們更加利用這個配置檔,使用一些其它的 option

1
2
3
4
5
6
7
<phpunit bootstrap="vendor/autoload.php"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
stopOnFailure="true">
</phpunit>

前兩個屬性已經是你所熟悉的,其餘看個人的選擇,我傾向將所有錯誤、通知、警告轉換為異常,此外,如果一個測試失敗,那麼我想取消剩餘的測試,有些人可能不喜歡,但如果你只關心修復第一個錯誤,那也不需要執行之後數以百計的測試。

依據目前的情況,我們仍然要手動指定路徑,這樣不太好,設置自定義目錄,使用一個 設定以及多個 設定,例:

1
2
3
4
5
6
7
8
9
10
11
12
<phpunit bootstrap="vendor/autoload.php"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
stopOnFailure="true">
<testsuites>
<testsuite name="Test Suite">
<directory>tests</directory>
</testsuite>
</testsuites>
</phpunit>

當你只想測試你所有測試套件裡的某個子集,這種方式可以大大增加靈活度,增加一個專門用於整合測試的測試套件

1
2
3
4
5
6
7
8
9
<testsuites>
<testsuite name="Test Suite">
<directory>tests</directory>
</testsuite>
<testsuite name="Integration">
<directory>tests/integration</directory>
</testsuite>
</testsuites>

當你只想執行 “Integration” 這個測試套件時

1
phpunit --testsuite="Integration"

在本書太多數章節,我們只使用一個主測試套件,但在實務上,一定要有系統的建立測試,你不會希望在存檔進行單元測試時執行了驗收測試。

如果你想執行上面所列出來的所有測試,你只需要執行 phpunit 即可。

持續測試

每次儲存檔案時自動執行測試是一個好的方式,像 Sublime Text 這樣的輕量級編輯器不提供這種功能,但可以安裝一些工具來完成這件事

本書作者介紹是安裝 Ruby 的套件來達到儲檔自動執行測試,但我覺得過程有點麻煩,所以這邊介紹一下 PhpStorm 的 File Watchers 來達到自動執行測試

安裝 PHPUnit Notifier

要自動執行測試之前,先安裝個測試通知套件,方便在自動執行測試後,可以直接通知測試結果

這邊使用 PHPUnit Notifier 這個套件

1
composer require --dev "mdarse/phpunit-notifier"

安裝完之後,在 phpunit.xml 裡加上監聽

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<phpunit bootstrap="vendor/autoload.php"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
stopOnFailure="true">
<testsuites>
<testsuite name="Test Suite">
<directory>tests</directory>
</testsuite>
</testsuites>
<listeners>
<listener class="PHPUnitNotifier\NotifierListener"></listener>
</listeners>
</phpunit>

之後只要再這個專案底下執行測試就會跳出測試結果通知

2017-03-18_23-59-23-2

2017-03-19_00-46-29

PhpStorm File Watchers

已經安裝完通知套件後,再來設定 PhpStorm File Watchers 來達到存檔自動執行測試

開啟 Preferences → Tools → File Watchers

Choose Template

New Watcher

Name:自訂名稱
File type:選擇 PHP
Scope:選擇監聽範圍

Scopes

選擇工作目錄

Program:這邊使用 vendor 底下的 phpunit

以上設定完畢之後,PhpStorm 就會依據剛設定的目錄來監聽檔案存檔後是否有異動,有異動則會自動執行剛所設定的 phpunit

2017-03-19_00-29-34

2017-03-19_00-30-07