PHPUnitの基本、最初の一本を書いて回すまで
PHPUnitの基本とは、TestCase を継承したクラスに test で始まるメソッドを並べ、assert で期待値と実際の値を突き合わせてコードの正しさを自動で確かめる書き方です。
テストクラスとテストメソッドの形
PHPUnitのテストは、TestCase を継承したクラスに、test で始まるメソッド(あるいは属性付きメソッド)を並べるのが基本形です。1メソッド1シナリオくらいの粒度にしておくと、落ちたときにどこが壊れたか一目で分かって助かります。名前も日本語コメントより、メソッド名で意図が読めるようにしておきたいですね。
use PHPUnit\Framework\TestCase;
final class CalculatorTest extends TestCase
{
public function test_加算できる(): void
{
$calc = new Calculator();
$this->assertEquals(5, $calc->add(2, 3));
}
}
assertEqualsとassertSameの違い
よく使う assert のなかでも、assertEquals と assertSame の違いは早めに押さえておくと安心です。assertEquals は緩やかな比較で型が違っても値が同じなら通りますが、assertSame は型まで含めて厳密に一致を見ます。文字列の “5” と整数の 5 を区別したいなら assertSame です。
$this->assertEquals('5', 5); // 通る(値が同じ)
$this->assertSame('5', 5); // 落ちる(型が違う)
$this->assertSame(5, $calc->add(2, 3)); // 型ごと検証したいとき
私はできるだけ assertSame を使うようにしています。緩い比較だと、意図せず型が変わってしまったバグをテストがすり抜けてしまうことがあるからですね。
期待値を先、実際の値を後に
引数の順番も地味に大事で、多くの assert は「期待値、実際の値」の順です。逆にすると失敗メッセージの Expected と Actual が入れ替わって表示され、原因を読み違えることがあります。
// 良い: 期待値が先
$this->assertSame(5, $result);
// 逆だと失敗時のメッセージが紛らわしい
$this->assertSame($result, 5);
まとめ
最初の一本は、正常系をひとつ assertSame で確認するだけで十分だと思います。テストが回る土台さえできれば、あとはケースを足していくだけですね。型まで見る assertSame を基本に、期待値を先に書く、この2つを習慣にしておくと、失敗メッセージが素直に読めて後々ラクになる気がします。
よくある質問
Q. assertEquals と assertSame はどちらを使うべきですか?
A. 型まで厳密に見たいなら assertSame です。assertEquals は型が違っても値が同じなら通るので、”5″ と 5 を区別したい場面ではすり抜けに注意が必要です。
Q. assert の引数はどちらが先ですか?
A. 多くの assert は「期待値、実際の値」の順です。逆にすると失敗時の Expected と Actual が入れ替わって表示され、原因を読み違えやすくなります。