4

假设我有以下课程:

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个独立的功能吗?为什么?为什么不?

4

1 回答 1

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)
        );
    }
}

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

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

/**
 * @expectedException InvalidArgumentException
 */
public function testError() {
    Foo::bar("invalidArgument");
}
于 2012-09-19T13:23:43.593 回答