アサーションの使い方
アサーション・メソッドの種類
前回は、PHPUnitをインストールし、簡単なテストを実行する方法について説明しました。その中で、assertEquals()というアサーション・メソッドを使い、2つの文字列が一致することを確認するテストを作成しました。
基本的なテストであれば、assertEquals()だけで間に合うのですが、数値の大小を比較したり、配列のキーや要素について調べたりする場合は、あらかじめ専用のメソッドがあると便利です。実は、PHPUnitでは、図1のようなアサーション・メソッドがあらかじめ用意されています。これらを利用することで、効率的にテスト・ケースを作成できます。
そのほかのアサーション・メソッドについては、こちらを参照してください。
メソッド名 | 成功条件 -------------------------------+----------------------- assertEquals(a, b) | aとbが等しい assertNotEquals(a, b) | aとbが等しくない assertTrue(a) | aが真(TRUE) assertFalse(a) | aが偽(FALSE) assertNull(a) | aがNULL assertNotNull(a) | aがNULLではない assertRegExp(reg, s) | 文字列sが正規表現regにマッチ assertArrayHasKey(k, a) | 配列aにキーkが存在する assertContains(v, a) | 配列aに要素vが存在する assertLessThan(a, b) | bがaより小さい assertLessThanOrEqual(a, b) | bがa以下 assertGreaterThan(a, b) | bがaより大きい assertGreaterThanOrEqual(a, b) | bがa以上 assertStringStartsWith(a, b) | 文字列bがaから始まっている assertStringEndWith(a, b) | 文字列bがaで終わっている assertType(t, a) | 変数aの型がtと一致する |
図1:アサーション・メソッド(一部) |
アサーション・メソッドの使い分け
分かりやすいテスト・ケースを書くためには、アサーション・メソッドを目的に応じて使い分けることが大切です。 以下に、使い分けのサンプルを示しました。
あるメソッドの戻り値がNULLでない事をテストしたい場合は、(3)のように書いた方が簡潔になりますし、アサーションが失敗した場合に出力されるエ ラー・メッセージも分かりやすくなります。
--------------------------------------------------------------------------------
(1)assertTrue()を使った場合
$this->assertTrue(
$this->object->getMessage() != null
);
エラー・メッセージ:
Failed asserting that
(2)assertNotEquals()を使った場合
$this->assertNotEquals(
null,
$this->object->getMessage()
);
エラー・メッセージ:
Failed asserting that
(3)assertNotNull()を使った場合
$this->assertNotNull(
$this->object->getMessage()
);
エラー・メッセージ:
Failed asserting that
--------------------------------------------------------------------------------
また、アサーション失敗時のエラー・メッセージを、独自に定義することもできます。下記のように、アサーション・メソッドの引数にエラーの内容を具体的 に記述することで、テストが失敗した原因を把握することができます。
特に、1つのテスト・メソッドの中で複数のアサーション・メソッドを呼んでいる場合に、どのアサーションで失敗したのか区別するのに役立ちます。テス ト・ケースのソースを眺める時にも、どういうテストをしているのか分かりやすくなります。
--------------------------------------------------------------------------------
public function testGetMessage()
{
$this->assertNull(
$this->object->getMessage(),
"メッセージがnullで初期化されていない"
);
$this->object->setMessage('こんにちは');
$this->assertEquals(
'こんにちは',
$this->object->getMessage(),
"セットしたメッセージが取得できない"
);
}
エラー・メッセージ:
1) HelloTest::testGetMessage
メッセージがnullで初期化されていない
Failed asserting that
--------------------------------------------------------------------------------
ちなみに、テスト・メソッド名は"test"で始まっていれば、どんな名前でもテスト・メソッドとして実行されるので、日本語の文字列(UTF-8)を 使うこともできます。そうすると下記のように、エラー・メッセージにも日本語のテスト・メソッド名が表示されるようになります。あくまでもご参考までに。
--------------------------------------------------------------------------------
public function testメッセージの初期化を確認()
{
$this->assertNull(
$this->object->getMessage(),
"メッセージがnullで初期化されていない"
);
}
エラー・メッセージ:
1) HelloTest::testメッセージの初期化を確認
メッセージがnullで初期化されていない
Failed asserting that
--------------------------------------------------------------------------------
次に、テスト・メソッドの作成を自動的に行ってくれるアノテーション機能について解説します。