PHPUnit:测试具有多个数据集的函数的最佳方法是什么?

时间:2012-09-19 09:20:37

标签: php phpunit

假设我有以下课程:

class Foo
{
    static function bar($inputs)
    {
         return $something;
    }
}

现在,在测试类中,我有以下结构:

class FooTest extends PHPUnit_Framework_TestCase
{
    function testBar()
    {
         $result = Foo::bar($sample_data_1);
         $this->assertSomething($result);

         $result = Foo::bar($sample_data_2);
         $this->assertSomething($result);

         $result = Foo::bar($sample_data_3);
         $this->assertSomething($result);
    }
}

这是一个很好的结构吗?我应该将testBar()划分为3个单独的函数吗?为什么?为什么不呢?

1 个答案:

答案 0 :(得分:6)

如果您使用具有不同数据集的相同代码并且您期望输出类似的输出,则可以使用dataProvider() feature

改编自PHPUnit文档的示例:

<?php
class DataTest extends PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider provider
     */
    public function testAdd($sample, $data, $result)
    {
        $this->assertEquals($result, Foo::bar($sample, $data);
    }

    public function provider()
    {
        return array(
          array(0, 0, 0),
          array(0, 1, 1),
          array(1, 0, 1),
          array(1, 1, 3)
        );
    }
}

如果你有完全不同的返回值/结构,例如它根据输入返回XML和JSON,那么最好有多个测试,因为你可以使用正确的assert[Xml/Json]StringMatches()函数,你会得到更好的错误输出。

对于其他错误检查,我建议添加更多测试方法:

/**
 * @expectedException InvalidArgumentException
 */
public function testError() {
    Foo::bar("invalidArgument");
}