アサーションの使い方

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

データ・プロバイダの利用(1)

 データ・プロバイダを利用することで、あらかじめ定義したデータ・セットに基づいたテストを簡潔に記述することができます。

まずは、@assertアノテーションで自動生成したテスト・ケースと比較するために、同様のテストをデータ・プロバイダを使って記述してみます(図3-1)。

データ・プロバイダを利用するため、testEvaluate()メソッドのコメント部分に@dataProviderアノテーションを記述します。このアノテーションは引数に、データを提供するデータ・プロバイダ・メソッド名を指定します。この例では、provider()メソッドがデータ・プロバイダ・メソッドです。

provider()メソッドでは、テストで使用されるデータ・セットを配列で返すよう実装します。配列の各要素はテスト・メソッドの引数に合わせて自由に定義できます。

						/**
 * @dataProvider provider
 */
public function testEvaluate($n, $expected)
{
    $this->assertEquals(
      $expected,
      $this->object->evaluate($n)
    );
}

public function provider()
{
    return array(
        array(3, 'Fizz'),
        array(5, 'Buzz'),
        array(15, 'FizzBuzz'),
    );
}

					
図3-1:データ・プロバイダを使って記述したテスト(1)
						/**
 * 'Fizz', 'Buzz', 'FizzBuzz'を返すことを確認する
 *
 * @dataProvider provider
 */
public function testEvaluateReturnsFizzBuzz($n, $expected)
{
    $this->assertEquals(
      $expected,
      $this->object->evaluate($n)
    );
}

/**
 * ''を返すことを確認する
 *
 * @dataProvider provider2
 */
public function testEvaluateReturnsEmpty($n)
{
    $this->assertEquals(
        '',
        $this->object->evaluate($n)
    );
}

public function provider()
{
    return array(
        array(3, 'Fizz'),
        array(5, 'Buzz'),
        array(15, 'FizzBuzz'),
    );
}

/**
 * 3と5の倍数以外のデータを返す。
 */
public function provider2()
{
    $data = array();
    for ($i = 1; $i < 100; $i++) {
        if (!($i % 3)) continue;
        if (!($i % 5)) continue;
        $data[] = array($i);
    }
    return $data;
}

					
図3-2:データ・プロバイダを使って記述したテスト(2)

データ・プロバイダの利用(2)

図3-2の例では、データ・プロバイダ・メソッドを2つ用意して、FizzBuzz文字列を返す場合と、何も返さない場合についてテストを行います。2つのテスト・メソッドでそれぞれ異なるデータ・プロバイダ・メソッドを、@dataProviderアノテーションで指定しています。

provider2()は、1から100までの間で、3と5の倍数以外をデータとして返します。このように、固定値のデータを返すだけでなく、プログラム的にテスト・データを生成することが可能なので、より多くのデータについてテストを実施することができます。

作成したテストを実行して、結果を確認します。

--------------------------------------------------------------------------------
phpunit FizzBuzzTest2
PHPUnit 3.4.12 by Sebastian Bergmann.

........................................................
Time: 0 seconds, Memory: 6.00Mb

OK (56 tests, 56 assertions)
--------------------------------------------------------------------------------

56回のアサーションがすべて成功し、無事にテストが成功しました。

このように、PHPUnitを使えば、あらかじめ用意された機能を利用して、テスト・ケースを作成することができます。また、作成したテストは統一感があるため、別のテストに再利用しやすくなります。

今回は、アサーションの種類や使い分けと、アノテーションを利用したテストの方法について紹介しました。次回は、データベースのテストや、未実装のモジュールを補完してテストする方法について紹介します。

PCIアイオス株式会社

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

連載バックナンバー

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

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

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

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