RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

PHPUnitのアサーションメソッドを知ろう!

f:id:tech-rakus:20200716170548p:plain

こんにちは、takaramです。

最近業務でPHPUnitを使ったテストを書く機会が増えてきました。初めはassertEqualsしか知らなかったわけですが、最近は適切なアサーションメソッドを選択できるようになってきました。そこで今回は数あるPHPUnitアサーションメソッドの中から、一般的によく使いそうなものを独断と偏見で選んでご紹介します!

なお、以下の内容は執筆時点の最新版のPHPUnit (v9.2.6) に基づいています。

PHPUnitアサーションメソッド

assertEquals

ある値が期待した値と等しいかどうかを判定します。PHPUnitの初心者向け資料にもよく出てくるおなじみのメソッドですが、基本的にはほぼ使いません。というのも、これは暗黙の型変換が行われるからです*1。たとえば、以下のアサーションは全て成功します。

$this->assertEquals(1, '1');
$this->assertEquals(null, '');
$this->assertEquals(null, false);
$this->assertEquals(null, 0);
$this->assertEquals('1', true);

テストにおいては、こうした型変換は嬉しい場面よりも困る場面のほうが多いのではないでしょうか。引数の内容によっては型変換が起こらないケースもありますが、特に理由がない限りは使わないと思っていいでしょう。

assertSame

ではassertEqualsの代わりに何を使うかというと、このassertSameです。型も含めた比較が行われます。

PHPUnit初心者なら、とりあえずこれさえ知っていれば何とかなります。

$this->assertSame('hoge', 'hoge'); // OK
$this->assertSame(0, 0);           // OK
$this->assertSame(false, false);   // OK

$this->assertSame('hoge', 'fuga'); // NG
$this->assertSame(0, false);       // NG
$this->assertSame(7, '7');         // NG

assertTrue, assertFalse, assertNull

それぞれtrue, false, nullと等しいことを判定します。型変換は行われません。つまり、以下の2つはほぼ同等です。

$this->assertTrue($actualValue);
$this->assertSame(true, $actualValue);

どちらでもテストの成功・失敗は変わりませんが、失敗時のメッセージがassertTrueなどの方が多少分かりやすくなります。

# assertSame(true, false) のメッセージ
Failed asserting that false is identical to true.

# assertTrue(false) のメッセージ
Failed asserting that false is true.

assertCount

配列やcountableなオブジェクトの要素数を検査します。assertSameの引数にcount()の結果を渡すことでも同じテストはできますが、これもやはり失敗時メッセージがassertCountの方が分かりやすくなっています。

# assertSame(1, count([])) のメッセージ
Failed asserting that 0 is identical to 1.

# assertCount(1, []) のメッセージ
Failed asserting that actual size 0 matches expected size 1.

assertStringStartsWith, assertStringEndsWith, assertStringContainsString

文字列の内容を部分一致で検査するアサーションです。同じことをassertSameでやろうと思うとstrpos()substr()を使うことになりますが、これらのアサーションメソッドを利用したほうがテストコード上も意図がわかりやすくなりますね。

// 以下2つは同じ内容のテスト
$this->assertStringStartsWith('foo', $string);
$this->assertSame(0, strpos($string, 'foo'));  // 何をテストしたいのかすぐ理解しにくい

// 以下2つは同じ内容のテスト
$this->assertStringEndsWith('bar', $string);
$this->assertSame('bar', substr($string, -3)); // これも理解しにくい

assertRegExp

文字列が正規表現にマッチするか検査します。上記のassertStringContainsStringなどよりも条件が複雑な場合に使えます。

assertIsXXX, assertInstanceOf

値が配列かどうかを検査するために、assertTrue(is_array($value))とする代わりにassertIsArray($value)と書くことができます。is_array以外にもis_int, is_numeric, is_string, is_bool, is_callable, is_objectなど、is_xxxの関数に対応するアサーションメソッドは一通り用意されています。

また、オブジェクトの型を検査したい場合はassertInstanceOf(SomeClass::class, $value)が使えます。

最後に

今回紹介したアサーションメソッドはごく一部です。アサーションメソッドの一覧がマニュアルにあるので、どんなメソッドが用意されているのか、ぜひ一度見てみてください!

*1:PHPの==演算子に似ていますが、以下の記事で解説されているように、厳密には異なります。https://qiita.com/aminevsky/items/238b7ed77766a3d3023d

Copyright © RAKUS Co., Ltd. All rights reserved.