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