php - 仅在 PHPUnit 中需要时才执行 dataProviders?

标签 php phpunit

我的测试套件甚至需要几分钟才能开始。这是因为数据提供者在 phpunit 启动时立即执行,并且它们的所有数据(数千个对象)都保存在内存中。

有没有办法在测试运行之前调用 dataProviders?我不在乎在屏幕上看到如此精确的进度。

谢谢

最佳答案

这需要一些重构,但我建议从您的测试方法中去除数据提供者,而是在您的实际测试中对数据提供者方法进行方法调用。

正如您已经从 PHPUnit 的手册中了解到的:

所有数据提供程序都在调用 setUpBeforeClass 静态方法和第一次调用 setUp 方法之前执行。因此,您无法访问您在数据提供者中创建的任何变量。这是 PHPUnit 能够计算测试总数所必需的。

您应该改为将这些数据提供者放入您的测试方法可以临时调用的哑类中。

所以代替

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

/**
 * As you know this will be executed before any tests, as will all of them
 */
public function additionProvider()
{
    return [
        [0, 0, 0],
        [0, 1, 1],
        [1, 0, 1],
        [1, 1, 3]
    ];
}

在扩展 PHPUnit\Framework\TestCase 的测试基类中定义您的数据提供者,将它们组织成逻辑组,然后从这些基类中扩展您的测试类。

class SomeDataProviderClass extends TestCase
{
    public function provideSomeData()
    {
        return [
            [0, 0, 0],
            [0, 1, 1],
            [1, 0, 1],
            [1, 1, 3]
       ];
    }
}


class AnActualTest extends SomeDataProviderClass
{
    public function testThatDependsOnSomeDataBeingProvided()
    {
        $data = $this->provideSomeData()
        // Use the data and do your test
    }
}

显然,考虑到您有多少测试,这并不理想,但除了到处都有很多 @dataProvider 注释(大概;因为您没有提供任何我无法分辨的代码)之外,以这种方式组织起来更好。所有数据提供者方法都将按逻辑组织并更易于维护,当然这将使测试运行得更快。

唯一可能的缺点是,如果您的数据提供者从数据库等中获取数据(同样,因为您没有发布代码,我不知道),因为多次调用同一个提供者函数将是每次数据库往返.但是,您可以轻松缓存此类方法调用的返回值。

关于php - 仅在 PHPUnit 中需要时才执行 dataProviders?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41057013/

相关文章:

php - PHP 和 MySQL 中使用下拉列表的多个搜索值

PHPUnit 将模拟对象作为参数传递给另一个对象的构造函数并使用 expects() 方法

PhpUnit 和 Laravel 5.4 如何在测试期间模拟 session 数据

javascript - 如何在自定义页面(而不是商店/产品页面)上添加“添加到购物车”按钮 Woocommerce

php - 如何将多个查询作为数组运行

Symfony PHP Unit Bridge 只显示一次弃用通知

php - 如何将一组测试用例发送到 PHPUnit willReturnOnConsecutiveCalls

php - 无法通过 pear 安装 PHPUnit

php - fatal error : require_once(): Failed opening required

php - 消息:未定义的属性:使用 codeigniter 的 CI_Loader::$session