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