在使用PHPUnit的DataProvider方法时,按官方帮助文档所说编写测试脚本如下:
class DataTest extends PHPUnit_Framework_TestCase
{
public function provider()
{
return array(
array(0, 0, 0),
array(0, 1, 1),
array(1, 0, 1),
array(1, 1, 3)
);
}
public function testAdd($a, $b, $c)
{
$this->assertEquals($c, $a + $b);
}
}
?>
运行该测试脚本时总会出现如下错误提示:
Missing argument 1 for DataTest::testAdd()
于是上google和baidu分别搜索了一把,能找到的帮助不多,但基本上有以下两种解决方案
方案一:是说provider()方法必须是静态的,也就是说该方法应该写成如下形式:
public static function provider()
{
return array(
array(0, 0, 0),
array(0, 1, 1),
array(1, 0, 1),
array(1, 1, 3)
);
}
方案二:不仅将provider()方法设计成静态的,而且还将整个代码改成如下样式:
class DataTest extends PHPUnit_Framework_TestCase
{
protected static $myData = array(
array(0, 0, 0),
array(0, 1, 1),
array(1, 0, 1),
array(1, 1, 3)
);
public static function provider()
{
return self::$myData;
}
public function testAdd($a, $b, $c)
{
$this->assertEquals($c, $a + $b);
}
}
?>
其实方案一和二有着异曲同工之处,但不论我怎么改问题依然如故。
无奈之余,我将代码进行归并整理,又写成了如下样式:
class DataTest extends PHPUnit_Framework_TestCase
{
public static function provider()
{
return array(
array(0, 0, 0),
array(0, 1, 1),
array(1, 0, 1),
array(1, 1, 3)
);
}
public function testAdd($a, $b, $c)
{
$this->assertEquals($c, $a + $b);
}
}
?>
再次试着运行测试脚本,让人兴奋的是居然可以成功运行了,呵呵,真有柳暗花明的妙处。细看下来解决此问题主要有以下两点:
1.provider必须是静态方法,因此该方法添加了static关键字;
2.注释 @dataProvider provider确是至关重要的,该注释指明了测试方法要调用的provider,将返回一个包含有数组参数的数组对象供测试方法调用。