第39回: PHPUnit基礎 — テストを「自動化」してコードの安全網を張る

章: 第5章: テストと品質管理

コードを修正するたびに、手動で動作確認することに疲れていませんか?

機能が増えるにつれて手動確認のコストは指数的に増えます。PHPUnitによるテストを自動化しておけば、変更のたびに「全体が壊れていないか」を数秒で確認できます。

テストを書かずに開発を続けると何が起きるか

リファクタリングやライブラリのバージョンアップが怖くなり、コードが硬直化していきます。また、バグを本番で発見してから修正するコストは、開発中に発見するコストの何倍にもなります。PHPUnitは入力と期待出力を宣言することで、動作保証を自動化します。

テスト設計の良い例・悪い例

観点 悪い例 良い例
テスト名 test1 / testMethod test_add_returns_correct_sum で意図を明示
アサーション assertTrue だけで済ませる assertSame / assertInstanceOf で型まで検証
例外テスト try { ... } catch を手書き $this->expectException() を使う
テストの独立性 テスト間でDBや状態を共有 各テストで状態をリセット・独立させる

チェックポイント: テストメソッド名は test_ プレフィックスか @test アノテーションが必要です。テスト名には「何を」「どうなるか」を含めましょう。test_divide_throws_on_zero のように読むだけでテスト内容が分かる名前が理想です。

コードサンプル


<?php
use PHPUnit\Framework\TestCase;
class CalculatorTest extends TestCase {
    public function test_add_returns_correct_sum(): void {
        $calc = new Calculator();
        $this->assertSame(5, $calc->add(2, 3));
    }
    public function test_divide_throws_on_zero(): void {
        $this->expectException(DivisionByZeroError::class);
        (new Calculator())->divide(10, 0);
    }
}
// 実行: ./vendor/bin/phpunit

まとめ & 次のステップ

  • PHPUnitでテストを自動化すると、修正後の動作確認コストを大幅に削減できます
  • テストメソッド名は「何が・どうなるか」を含めて意図を明示しましょう
  • assertSame は型と値を両方確認するため、assertEquals より厳密です
  • expectException() で例外ケースのテストを宣言的に書けます
  • ./vendor/bin/phpunit でテストを実行し、全テストがグリーンになることを確認しましょう

次回は モックとスタブ を学びます。外部依存をテスト中に置き換えて、速く安定したテストを書く方法を整理しましょう。

Related Articles