PR

アサーションの使い方

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のWebサイトにログインすることでさまざまな限定特典を入手できるようになります。

Think IT会員サービスの概要とメリットをチェック

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