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

Dur*_*sun 4 php phpunit

假设我有以下课程:

class Foo
{
    static function bar($inputs)
    {
         return $something;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个很好的结构吗?我应该testBar()分成3个独立的功能吗?为什么?为什么不?

edo*_*ian 6

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

从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)
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

/**
 * @expectedException InvalidArgumentException
 */
public function testError() {
    Foo::bar("invalidArgument");
}
Run Code Online (Sandbox Code Playgroud)