こんにちは、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)
が使えます。
最後に
今回紹介したアサーションメソッドはごく一部です。アサーションメソッドの一覧がマニュアルにあるので、どんなメソッドが用意されているのか、ぜひ一度見てみてください!
エンジニア中途採用サイト
ラクスでは、エンジニア・デザイナーの中途採用を積極的に行っております!
ご興味ありましたら是非ご確認をお願いします。
https://career-recruit.rakus.co.jp/career_engineer/カジュアル面談お申込みフォーム
どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。
以下フォームよりお申込みください。
rakus.hubspotpagebuilder.comラクスDevelopers登録フォーム
https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/イベント情報
会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください!
◆TECH PLAY
techplay.jp
◆connpass
rakus.connpass.com
*1:PHPの==演算子に似ていますが、以下の記事で解説されているように、厳密には異なります。https://qiita.com/aminevsky/items/238b7ed77766a3d3023d