章: 第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でテストを実行し、全テストがグリーンになることを確認しましょう
次回は モックとスタブ を学びます。外部依存をテスト中に置き換えて、速く安定したテストを書く方法を整理しましょう。