<?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(データプロバイダ)という手段が用意されています。
<?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つのお約束を守る必要があります。
これらを守ったメソッドは、データプロバイダとして使用することができます。
データプロバイダを使用するためには、アノテーション(Annotation)というものを使います。
HundredTest2.phpのうち、
/** * @dataProvider myProvider */
この部分がアノテーションです。
データプロバイダを使いたいメソッドの前にコメントを作り、 「@」(アットマーク)に続けてデータプロバイダとして使用したいメソッド名を書く と、それは「myProviderメソッドをデータプロバイダとして使いますよ」というアノテーションを書いたことになります。