📝

PHPUnit初心者向け:色々なアサーション

2020/09/28に公開

対象者

PHPUnitを初めて間もない初心者向けの記事となります。

記事中で使用しているバージョン

PHP7.4
PHPUnit 9.3.9

筆者のレベル

TDD絶賛実践中。
テスト駆動開発
実践テスト駆動開発
はいったん読了。
php開発案件にて、phpunitの自動テスト環境を構築してみたばかり。

よく使うアサーションあれこれ

現在開発中の案件ではTDDを取り組んでいます。
社内ではまだ取り組みが浅く、他PGも経験値が少ない状態でした。

これくらいは知っているかな?と思うものでも意外と知らない箇所があったようなので
基本となるアサーションについて初心者向けに簡単にまとめてみようと思います。

ゆるい比較

assertEquals。最もよく使うアサーションかと思います。

$actual = min(5, 10);
$this->assertEquals(5, $actual);

シンプルな値の比較ですね。
ゆるい比較のため == と同じ比較になります。
そのため、$actualが"5"だったとしてもテストは通ります。

厳密な比較

値だけでなく厳密に型も比較したい場合(=== に相当する)アサーションはassertSameになります。

$acual = min(5, 10);
$this->assertSame(5, $actual);

bool値の判定

$actual = $stringCompare->isFuga('fuga');
$this->assertEquals(true, $actual);

結果をboolで比較する場合、assertEqualsでも比較はできますが、
もっと簡単にかけるアサーションがあります。

$actual = $stringCompare->isFuga('fuga');
$this->assertTrue($actual);

こちらの方が書く量も少なく、意図も伝わりやすいですね。
同様にassertFalseも存在します。

インスタンスの判定

インスタンスが指定のクラスなのか判定したい場合はassertInstanceOfを使用します。
Factoryクラスの検証によく使いますね。

$actual = $factory->createHoge();
$this->assertInstanceOf(Hoge::class, $actual);

例外の判定

インスタンスの判定ができるんで、throwされたExceptionも判定できそうですね。

try {
    // 内部でInvalidArgumentExceptionがthrowされるfugaを実行
    $hoge->fuga(1, 2);
} catch(\Exception $e) {
    $this->assertInstanceOf(InvalidArgumentException::class, $e);
}

一見いけそうですし、実際InvalidArgumentExceptionが投げられればテストは通るのですが
もっと良い検証方法があります。

$this->expectException(InvalidArgumentException::class);
// 内部でInvalidArgumentExceptionがthrowされるfugaを実行
$hoge->fuga(1, 2);  	

(厳密にはアサーションではないんですが)
expectExceptionを使用して投げられる例外を指定できます。
try,catchを書く必要もなく、テスト冒頭で期待値を明示できて可読性があがります。

配列の個数を検証

assertCountを使用します。標準関数のcountと同様ですね。

$this->assertCount(3, ['fizz', 'buzz', 'fizzbuzz']);

終わりに

ある程度傾向として、標準で用意されてる比較系の処理はアサーションとして用意されてる感じです。
こういう比較できるかな?と思ったらドキュメントをあたってみれば大抵見つけられると思います。

参考

公式日本語ドキュメント

Discussion