單元測試是指對軟件中的最小可測試單元進行檢查和驗證。本篇文章帶大家了解一下php如何實現單元測試,介紹一下安裝單元測試工具PHPUnit并使用的方法。
朋友,你聽說過安。。。不是,寫過單元測試嗎。
單元測試是開發過程中必不可少的一環,一個項目有良好的單元測試代碼,重構的勇氣都大很多。這次寫一篇小文來介紹一下 PHP 的單元測試工具 PHPUnit 的使用。
PHPUnit 的使用并不難,這篇文章主要還是充當一個引子,介紹基本概念和使用,有了這篇文章的基礎之后,去看官網的文檔就會更加順風順水。
安裝
安裝 PHPUnit 的方式很簡單,使用 composer 可以一行代碼就可以安裝。
composer require --dev phpunit/phpunit
安裝之后,在 vendor/bin
目錄下有一個 phpunit 的可執行文件,這個就是 phpunit 本體了。假設我們項目的目錄結構如下:
? phpunit tree . ├── controller ├── model ├── service ├── test └── vendor ├── composer.json
其中我們的單元測試代碼都放在 test 目錄下。使用 composer 來為我們解決 autoload 的問題。
{ "autoload": { "psr-4": { "Controller\": "controller/", "Model\": "model/", "Service\": "service/", "Test\": "test/", } }, }
如果你還不懂 composer 自動加載的使用,可以參考這篇文章。最后執行 composer dumpautoload -o
讓自動加載生效。
到這里我們的安裝就算結束了。如果你使用 phpstorm 進行開發,那么你需要進行如下的配置:
這里指明了從哪里加載 PHPUnit,由于我們使用 composer 安裝,所以,這里的文件選擇 composer 生成的 autoload.php 文件即可。
使用
好了,假設我們現在進行開發,在 service 目錄中添加了一個 CalculateService
的文件,并且編寫了一個 abs 的函數。
namespace Service; class CalculateService { public function abs($num) { return abs($num); } }
現在我們對 abs
函數進行單元測試,PHPUnit 規定了一個測試類必須遵守如下的規定:
- 單元測試類名必須以 Test 結尾,必須繼承
PHPUnitFrameworkTestCase
基類。 - 每個測試函數必須以 test 開頭。
上面的規定是必須遵守的,如果代碼沒有遵守規定 PHPUnit 不會把他當做單元測試代碼。除了以上的兩條,還有一些良好的編碼習慣可以參考:
- 單元測試代碼都放在 test 目錄下。
- 每個單元測試類以被測試的類名開頭。例如被測試類為
CalculateService
,那么單元測試類應該為CalculateServiceTest
。 - 每個單元測試函數應該為被測試函數名結尾。例如被測試函數為
abs
,那么單元測試函數應該為testAbs
。
根據上面的規范,編寫單元測試代碼
class UserServiceTest extends PHPUnitFrameworkTestCase { public function testAbs() { $userService = new ServiceCalculateService(); $this->assertEquals(4, $userService->abs(4)); } }
在上面的測試代碼中,調用了我們要測試的函數 abs
,然后斷言 $userService->abs(4)
的結果為 4。在 phpstorm 中直接在 testAbs
函數處右鍵選擇 run UserServiceTest
執行:
發現在控制臺會輸出如下內容
Time: 17 ms, Memory: 4.00MB OK (1 test, 1 assertion)
表明 abs
通過了 $userService->abs(4) == 4
的測試用例。這里注意一點,這里并不表明 abs
函數已經通過測試,一個良好的測試應該包含多個測試用例來覆蓋盡可能多的可能性。
現在 PHPUnit 基本的單元測試已經運行成功了,在 PHPUnit 的文檔中,有