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

PHP 單元測試入門指南

     編輯:PHP 綜合知識

為什麼需要單元測試?

開發過程中常遇到:功能完成後 Bug 不斷、修一個壞一個、重構不敢動。單元測試是解決這些痛處的基礎工程實踐。

核心價值

  • 回歸保護:修改程式碼後重跑測試,瞬間驗證既有功能未破壞。
  • 重構信心:有測試覆蓋,大膽重構架構、優化效能。
  • 文件化:測試案例即活文件,展示類別/函式預期行為。
  • 設計倒逼:難測試的代碼通常耦合度高,測試驅動倒逼低耦合、高內聚設計。

PHPUnit 快速上手

# 安裝
composer require --dev phpunit/phpunit

# 執行
./vendor/bin/phpunit --bootstrap vendor/autoload.php tests/

第一個測試案例

<?php
// src/Calculator.php
class Calculator {
    public function add(float $a, float $b): float { return $a + $b; }
    public function div(float $a, float $b): float {
        if ($b == 0) throw new InvalidArgumentException('除數不可為零');
        return $a / $b;
    }
}

// tests/CalculatorTest.php
use PHPUnit\Framework\TestCase;

class CalculatorTest extends TestCase {
    private Calculator $calc;
    
    protected function setUp(): void {
        $this->calc = new Calculator();
    }
    
    public function testAdd(): void {
        $this->assertEquals(5, $this->calc->add(2, 3));
        $this->assertEquals(0.3, $this->calc->add(0.1, 0.2), '', 0.001); // 浮點數容差
    }
    
    public function testDivByZero(): void {
        $this->expectException(InvalidArgumentException::class);
        $this->calc->div(10, 0);
    }
    
    /**
     * @dataProvider addProvider
     */
    public function testAddDataProvider(float $a, float $b, float $expected): void {
        $this->assertEquals($expected, $this->calc->add($a, $b));
    }
    
    public function addProvider(): array {
        return [
            [1, 2, 3],
            [0, 0, 0],
            [-1, 1, 0],
            [1.5, 2.5, 4.0],
        ];
    }
}
?>

進階實踐原則

原則說明
F.I.R.S.TFast(快)、Independent(獨立)、Repeatable(可重複)、Self-validating(自我驗證)、Timely(及時)
AAA 模式Arrange(準備)、Act(執行)、Assert(斷言) — 每個測試結構清晰
單一職責一個測試只驗證一個行為/邊界條件
命名規範test[Method]_[Scenario]_[Expected] 如 testDiv_ZeroDivisor_ThrowsException

常見測試類型

  • 單元測試:隔離測試單一類別/函式(Mock 依賴)。
  • 整合測試:驗證多模組協作(資料庫、API、檔案系統)。
  • 功能/端到端測試:模擬真實用戶流程(Laravel Dusk, Codeception)。
  • 靜態分析:PHPStan, Psalm 捕捉型別錯誤、未使用變數等。

覆蓋率與 CI 整合

# 產生覆蓋率報告
./vendor/bin/phpunit --coverage-html coverage-report

# GitHub Actions 片段
- name: Run Tests
  run: ./vendor/bin/phpunit --coverage-clover=coverage.xml

避坑指南

❌ 測試實作細節而非行為(如斷言私有方法被呼叫)
❌ 測試間有共享狀態(資料庫未清理、靜態變數殘留)
❌ 追求 100% 覆蓋率卻忽略邊界條件
✅ 關注業務關鍵路徑、邊界值、異常流程
✅ 使用 setUp/tearDown 隔離測試環境
✅ 外部依賴用 Mock/Stub 隔離

單元測試不是成本,而是長期維護速度的投資。從核心領域模型開始寫起,漸進擴大覆蓋。

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