首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 單元測試實戰:從零開始建立 PHPUnit 測試體系

     編輯:PHP 相關知識

Web 應用 7×24 執行,代碼品質直接關乎業務穩定。單元測試透過自動化驗證最小代碼單元,讓開發者在重構、部署前擁有高度信心。本文以 PHPUnit 2.x 為例(現代專案請用 PHPUnit 9+/10+),示範測試驅動開發(TDD)核心流程。

環境建置

# 現代專案使用 Composer
composer require --dev phpunit/phpunit
# 執行測試
vendor/bin/phpunit --configuration phpunit.xml

TDD 紅-綠-重構循環

第一步:撰寫失敗的測試

<?php
// tests/AddTest.php
require_once 'Add.php';
class AddTest extends PHPUnit\Framework\TestCase {
    public function testAddTwoNumbers() {
        $this->assertEquals(3, add(1, 2));
    }
    public function testAddNegativeNumbers() {
        $this->assertEquals(-1, add(-2, 1));
    }
}

第二步:執行測試,確認失敗

$ vendor/bin/phpunit tests/AddTest.php
FAILURES!
Tests: 2, Failures: 2.

第三步:實作最小代碼通過測試

<?php
// Add.php
function add($a, $b) {
    return $a + $b;
}

第四步:執行測試,全部通過

OK (2 tests, 2 assertions)

第五步:重構(在綠燈保護下優化代碼)

如加入型別提示、邊界檢查、效能優化,每次修改後跑測試確保無回歸。

核心斷言方法速查

  • assertEquals($expected, $actual):值相等
  • assertSame($expected, $actual):型別與值皆相等
  • assertTrue/False($condition):布林判斷
  • assertNull/NotNull($var):空值檢查
  • assertContains($needle, $haystack):包含檢查
  • assertThrows($exceptionClass, $callable):例外拋出驗證

資料提供者:參數化測試

/**
 * @dataProvider additionProvider
 */
public function testAdd($a, $b, $expected) {
    $this->assertEquals($expected, add($a, $b));
}
public function additionProvider() {
    return [
        [1, 2, 3],
        [0, 0, 0],
        [-1, 1, 0],
        [1.5, 2.5, 4.0],
    ];
}

測試雙工:Mock 與 Stub

$mock = $this->createMock(Database::class);
$mock->method('connect')->willReturn(true);
$mock->method('query')->willReturn(['id'=>1, 'name'=>'Test']);
// 注入被測類別
$service = new UserService($mock);

最佳實踐原則

  1. 單一職責: 一個測試方法只驗證一個行為。
  2. 命名規範: test__(如 testAdd_PositiveNumbers_ReturnsSum)。
  3. 隔離性: 測試間無共享狀態,使用 setUp()/tearDown() 初始化。
  4. 快速執行: 單元測試應在毫秒級完成,避免真實 IO(資料庫、網路、檔案),改用 Mock。
  5. 持續整合: 併入 CI 流程,每次推送自動跑測,失敗即阻擋合併。

常見誤區

  • 測試實作細節而非行為(過度 Mock 內部私有方法)。
  • 測試覆蓋率迷思:100% 覆蓋率 ≠ 無 Bug,關鍵在邊界與業務邏輯分支。
  • 忽略整合測試:單元測試無法替代 API、資料庫、UI 的端到端驗證。

建立單元測試文化,不僅是工具引入,更是團隊對代碼品質的承諾。從今天開始,為每一個新功能寫下第一個失敗的測試吧。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved