<更新記録>
2008年 5月 30日
執筆

姉妹サイトから検索 Web検索

SWT - JavaでGUIプログラミング
きままにインデックス
JavaScriptノート
ゴルフ道具研究所

PHPUnitデータプロバイダ

Hundred.php
<?php
class Hundred {
	public static function isSumHundred($a, $b) {
		return ($a + $b == 100) true : false;
	}
}
?>

引数の和が100になるかどうかをチェックするメソッドHundred::isSumHundred()があったとします。
このテストを行うには、次のようなテストを書けます。

<?php
require_once 'PHPUnit/Framework.php';
require_once 'Hundred.php';

class HundredTest extends PHPUnit_Framework_TestCase {
	/**
	 * 50+50は100なので、trueが返るはず
	 */
	public function testIsSumHundred1() {
		$this->assertTrue(Hundred::isSumHundred(50,50));
	}
	
	/**
	 * 0+100は100なので、trueが返るはず
	 */
	public function testIsSumHundred2() {
		$this->assertTrue(Hundred::isSumHundred(0, 100));
	}
}
?>
C:\>phpunit HundredTest
PHPUnit 3.2.19 by Sebastian Bergmann.

..

Time: 0 seconds


OK (2 tests)

しかし、この書き方は、無駄にテストコードが長くなります。
しかも、もっと細かく、100+0の場合や、25+75の場合もテストしようとすると、その数だけメソッドやテストコードが比例して長くなっていきます。
決まりきったテストは、まとめて短く書くことができるように、dataProvider(データプロバイダ)という手段が用意されています。

HundredTest2.php
<?php
require_once 'PHPUnit/Framework.php';
require_once 'Hundred.php';

class HundredTest2 extends PHPUnit_Framework_TestCase {
	public static function myProvider() {
		return Array(
			Array(50,50),
			Array(0,100)
		);
	}

	/**
	 * @dataProvider myProvider
	 */
	public function testIsSumHundredTrue($a, $b) {
		echo '$a = ' . $a . ' $b = ' . $b . "\n";
		$this->assertTrue(Hundred::isSumHundred($a,$b));
	}
}
?>

上記のHundredTest2.phpをphpunitで実行すると、次のようになります。

C:\>phpunit HundredTest2
PHPUnit 3.2.19 by Sebastian Bergmann.

$a = 50 $b = 50
.$a = 0 $b = 100
.

Time: 0 seconds


OK (2 tests)

testIsSumHundredTrueメソッドは、2回呼び出されています。
1度目は、引数に(50,50)が渡され、2度目は引数に(0,100)が渡されています。

この、testIsSumHundredTrueメソッドの引数を提供しているのは、myProvider()メソッドです。
このメソッドが返した戻り値の配列の数だけtestIsSumHundredTrue()メソッドが実行され、 その際、配列の中に含まれた配列(Array(50,50)やArray(0,100))が使われているというわけです。

こうすることで、myProviderの戻り値を工夫するだけで、様々なバリエーションのテストを行うことが出来るようになり、手間が省けます。

データプロバイダのお約束

データプロバイダを作成するには、3つのお約束を守る必要があります。

  • publicメソッドであること
  • staticメソッドであること
  • 戻り値は配列の配列であること

これらを守ったメソッドは、データプロバイダとして使用することができます。

データプロバイダの利用法

データプロバイダを使用するためには、アノテーション(Annotation)というものを使います。
HundredTest2.phpのうち、

	/**
	 * @dataProvider myProvider
	 */

この部分がアノテーションです。

データプロバイダを使いたいメソッドの前にコメントを作り、 「@」(アットマーク)に続けてデータプロバイダとして使用したいメソッド名を書く と、それは「myProviderメソッドをデータプロバイダとして使いますよ」というアノテーションを書いたことになります。


Powered by VeryEasyCMS