我可以使用@depends来依赖使用@dataProvider的测试吗?

2022-08-30 19:58:19

我有一个测试类,其中一个测试通过一个测试运行多次,另一个测试在第一个方法上运行。但是,当我要求应该通过第二次测试的内容时,它给了我一个坚实的,这是我没想到的。@dataProvider@dependsvar_dumpNULL

换句话说:这应该做什么:

<?php 
class DevicesTest extends PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider registerDataProvider
     */
    public function testRegister($device, $supposedResult)
    {
        //do a bunch of tests
        return array($device, $supposedResult);
    }

    public function registerDataProvider()
    {
        return array(array("foo", "foo"));
    }

    /**
     * @depends testRegister
     */
    public function testSaveDevicePreferences($deviceArr)
    {
        $this->assertNotEmpty($deviceArr);
    }
}
?>

答案 1

在当前版本的PHPUnit(截至今天的5.4)中,这是可能的。

根据文档

当测试同时接收来自@dataProvider方法和它@depends的一个或多个测试的输入时,来自数据提供程序的参数将位于来自依赖测试的参数之前。对于每个数据集,依赖测试的参数将相同。

这是它的实际外观:

<?php

class DataProviderAndDependsCombinationTest extends AbstractUnittest{

    public function dataProviderForSomething()
    {
        return array(
            array(
                'someProvidedValue',
                'someOtherProvidedValue'
            )
        );
    }

    public function testToDependOn()
    {
        $this->assertTrue(true);
        return 'someDependedValue';
    }

     /**
     * @dataProvider dataProviderForSomething
     * @depends testToDependOn
     */
    public function testSomething($someProvidedValue, $someOtherProvidedValue, $someDependedValue)
    {
        $this->assertSame('someProvidedValue', $someProvidedValue);
        $this->assertSame('someOtherProvidedValue', $someOtherProvidedValue);
        $this->assertSame('someDependedValue', $someDependedValue);
    }
}

答案 2

通常,当您想要使用每个测试的不同数据集多次运行测试时,会使用。它的存在是为了避免在测试中编写循环代码,并允许不同的数据集单独通过或失败。@dataProvider

正如我在评论中所说,我相信PHPUnit将使用or从你的例子中,我的猜测是第二个获胜。另一种可能性是,使用数据提供程序的测试不能用作依赖项,因为 PHPUnit 不知道要选择哪个测试加数据集。@depends@dataProvider

由于返回单个数据集,因此您可以轻松地从测试本身调用它。这将允许在没有 .假设需要修改和/或,这应该有效:registerDataProvider@depends@dataProvidertestRegister$device$supposedResult

class DevicesTest extends PHPUnit_Framework_TestCase {
    public function testRegister() {
        list($device, $supposedResult) = $this->registerDataProvider();
        //do a bunch of tests
        //register a device in the DB
        return array($device, $supposedResult);
    }

    public function registerDataProvider() {
        return array("foo", "foo");
    }

    /**
     * @depends testRegister
     */
    public function testSaveDevicePreferences($data) {
        list($device, $supposedResult) = $data;
        // do stuff dependent on testRegister()
        $this->assertEquals($device, $supposedResult);
    }
}

如果这些变量不需要通过第一个测试进行修改,则只需从两个测试中调用即可。请注意,PHPUnit 不会像数据提供程序机制那样,将返回的数组从依赖测试的数组分离到依赖测试的参数中。这是因为它不知道返回的数组是多个参数还是单个参数。registerDataProvider


推荐