PHPUnitでテストする上で押さえておきたい知識

PHPUnitを使う上で知っておきたい用語や知識などについて解説します。データプロバイダ、フィクスチャなど聞きなれない用語があるかもしれませんが、よく活用するので押さえておきましょう。

テストに関する一般知識

TDD(テスト駆動開発)

まずテストを書く開発スタイルです。「赤(失敗)、緑(成功)、リファクタリング(成功を保つ)」の順で開発します。

ユニットテスト

ある入力値で関数を呼び出し、その結果(出力内容や動作)が正しいか判定します。

モック、スタブ

テスト用に用意した代替品です。

次のような時に利用します。

  • まだ完成していない部品を使うとき。
  • 「本物」でテストしたくないとき(DBを使いたくない時など)。

スタブ

モジュールの代わりとしてコールされ、テストケースにあった戻り値を返します。

モック

あるオブジェクトのメソッドがコールされたのかどうか、さらにどんな引数を渡してコールされたのかを検証するのに利用します。

テスト対象のメソッドを呼び出したとき、テスト対象のメソッド内で
あるオブジェクトのどういったメソッドが、
何回、
どういった引数で呼ばれることを期待しているのかを検証。

また、モックは、スタブ機能(下位モジュールの代わりに戻り値を返す)も持ちます。

PHPUnitに関する知識

テストクラス名

テスト対象クラス名Test という名前のクラスにします。例えば、テスト対象クラス名が User の場合、テストクラス名は UserTest とします。

テストメソッド名

テストメソッドであることを示すには、2通りの方法があります。

  • メソッド名に test という接頭辞をつける。
  • @testアノテーション を利用する。

アサーション

条件判定用メソッドです。

アサーションメソッドを利用して、以下のような判定を行います。

  • メソッドの戻り値の「型」や「内容」の判定
  • メソッドを実行したことによる状態変化(DB、セッション、キャッシュ、ログなど)の判定
アサーションメソッド 概要
assertEquals($exp, $act) expとactが等しい(==)
assertSame($exp, $act) expとactが等しい(===)
assertNotEquals($exp, $act) expとactが等しくない
assertContains(mixed $needle, Iterator array $haystack)
assertArrayHasKey(mixed $key, array $array) 配列にキーが含まれている
assertTrue($cond) $condがTRUE
assertFalse($cond) $condがFALSE
assertNull($var) $varがNULL
assertNotNull($var) $varがNULLではない
assertInternalType($type, $act) actの型がtypeと一致する
assertInstanceOf($expected, $actual) actualがexpectedのインスタンスである

この他のアサーションは、下記リンクから確認できます。
https://phpunit.de/manual/5.5/ja/appendixes.assertions.html

いろいろありますが、使うのは限られるかと思います。

例外テスト

正しく例外がスローされたかどうかを判定します。
@expectedExceptionアノテーションなど利用します。

テスト依存性

あるテストの結果をもとに、別のテストを実施することができます。
@dependsアノテーションを利用します。

データプロバイダ

複数のテストデータパターンでテストできます。
@dataProviderアノテーションを利用します。

フィクスチャ

  • setUpメソッド
    • テスト実行前に実行されるメソッドです。
  • tearDownメソッド
    • テスト実行後に実行されるメソッドです。

リフレクション

プライベートメソッドを外部アクセス可能にしてくれます。
ReflectionMethodクラスを利用します。

XML設定ファイル

テスト設定ファイルです。例えば、次のような設定が可能です。

設定 概要
colors 結果を色表示するか指定
bootstrap テスト前に実行させるPHPファイルを指定
stopOnFailure あるテストに失敗したら残りのテストはキャンセルするか指定
testsuite どのディレクトリにテストが存在するかなど指定

この他の設定は、下記リンクから確認できます。
https://phpunit.de/manual/5.5/ja/appendixes.configuration.html

XML設定ファイルは、phpunitコマンドの--configurationオプションで指定できます。

phpunit --configuration XML設定ファイル

--configurationオプションを指定しない場合、カレントディレクトリから phpunit.xml phpunit.xml.dist を順に探し、存在する場合はそれを自動的に読み込みます。

コードカバレッジ

  • ユニットテスト実行時、テスト対象プログラムの処理がどの程度実行されたかを表します。
  • Xdebugを有効にする必要があります。なのでテスト実行時間が長くなります。
  • コマンドラインのオプションで出力形式を指定できます。
  • XML設定ファイルにて、コードカバレッジ対象ファイルを指定できます。

用語整理

用語関連の整理のため、おおまかなイメージ図を示します。「Xxx」クラスに対するテストクラスとして、「XxxTest」クラスを示してます。

425-php-unit.png

参考

PHPUnitの詳しい使い方については、https://phpunit.de/manual/5.5/ja/index.html で確認できます。