Data Driven Test with PHPUnit3.2

PHPUnit 3.2的一个新特性就是支持DDT。最大的好处就是你在写与数据有关的unit test时可以少写很多代码。所谓DDT就是可以使用某已存在的数据来进行测试。比如在处理输入输出时,如果你改变了转换输入至输出的代码,那么不得不确保所有的输入数据仍是工作正确的。

在没有这个新特性之前,我们可能需要构造好整个输入及整个输出分别作为一个参数来进行assert。这种情况下你需要做大量的没有太多实际意义的代码来进行准备和处理。

而有个该新特性以后则十分方便以数据驱动的方式来进行测试(在.Net中NUnit是没有的,但mstest和xunit都具有这样的特性)。

下面是一个典型的DDT的例子,从PHPUnit的文档中取得:

class DataTest extends PHPUnit_Framework_TestCase
{
public static function provider()
{
return array(
array(0, 0, 0),
array(0, 1, 1),
array(1, 1, 3),
array(1, 0, 1)
);
}

/**
* @dataProvider provider
*/
public function testAdd($a, $b, $c)
{
$this->assertEquals($c, $a + $b);
}
}

这里有3个地方要注意,一个是static的provider方法,一个是@dataProvider的annotation,还有就是testAdd方法是带有参数的(与普通的testcase不同)。

所以此时如果我是对数据库的数据进行DDT的话,那么可以直接从数据库中取得数据后进行测试。这样的DataProvider返回的数据与MSTest中的TestContext有点相似。而除了数据库以外,常见的测试的时候我们常使用excel或csv来做输入输出数据的expect。
class DataTest extends PHPUnit_Framework_TestCase
{
public static function provider()
{
/*
$allresults = array(datarow, datarow, datarow…);
*/
return $allresults;
}

/**
* @dataProvider provider
*/
public function testLogic($datarow)
{
$this->assertEquals($expect, $targetmethod->processlogic($datarow));
}
}

Data Driver Test在自动化测试中相当的有用。所以非常非常高兴看到PHPUnit开始具有越来越丰富的功能,虽然在没有DDT之前也可以使用testsuite来做到,而且实际上PHPUnit中便是以testsuite来做到的。期待PHPUnit3.2的最终发布(当前是RC3)。

PS: 当前已经是3.2.0发布

Related Posts

Leave a Reply