アサーションの使い方

2010年4月14日(水)
伊丹 久兼

アサーション・メソッドの種類

前回は、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 is true.

(2)assertNotEquals()を使った場合
  $this->assertNotEquals(
    null,
    $this->object->getMessage()
  );

  エラー・メッセージ:
  Failed asserting that is not equal to .

(3)assertNotNull()を使った場合
  $this->assertNotNull(
    $this->object->getMessage()
  );

  エラー・メッセージ:
  Failed asserting that is not null.
--------------------------------------------------------------------------------

また、アサーション失敗時のエラー・メッセージを、独自に定義することもできます。下記のように、アサーション・メソッドの引数にエラーの内容を具体的 に記述することで、テストが失敗した原因を把握することができます。

特に、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 is not null.
--------------------------------------------------------------------------------

ちなみに、テスト・メソッド名は"test"で始まっていれば、どんな名前でもテスト・メソッドとして実行されるので、日本語の文字列(UTF-8)を 使うこともできます。そうすると下記のように、エラー・メッセージにも日本語のテスト・メソッド名が表示されるようになります。あくまでもご参考までに。
--------------------------------------------------------------------------------
  public function testメッセージの初期化を確認()
  {
    $this->assertNull(
      $this->object->getMessage(),
      "メッセージがnullで初期化されていない"
    );
  }

  エラー・メッセージ:
  1) HelloTest::testメッセージの初期化を確認
  メッセージがnullで初期化されていない
  Failed asserting that is not null.
--------------------------------------------------------------------------------

次に、テスト・メソッドの作成を自動的に行ってくれるアノテーション機能について解説します。

PCIアイオス株式会社

テンアートニ(現サイオステクノロジー)、ゼンド・ジャパンなどを経て現在、PCIアイオスに勤務。これまでに組込み開発からWebシステム開発まで幅広く開発を経験。現在は、オープンソースソフトウェアを利用したシステムの開発、運用、パフォーマンスチューニングを担当。特にLAMP(Linux/Apache/MySQL/PHP)環境を得意とする。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています