【问题标题】:How to prevent Fixtures from being reloaded between tests with CakePHP and PHPUnit如何防止在使用 CakePHP 和 PHPUnit 的测试之间重新加载 Fixtures
【发布时间】:2012-01-19 18:45:05
【问题描述】:

如何防止扩展 CakeTestCase(使用 PHPUnit)的 CakePHP 2.0 测试用例在测试之间重新加载夹具?

背景: 我们使用 PHPUnit 用 CakePHP 2.0 编写了一组集成测试。我们从标准CakeTestCase 扩展了测试用例类。对于这组测试,我们设置了一堆固定装置来填充数据库中的数据。自然,这些测试需要很长时间才能运行。基本上,所有时间都来自于 Cake 卸载和重新加载测试之间的所有固定装置。

所有测试都仅作为 READ。我们只是向数据库发出 find 调用,并根据这些结果测试一组类交互之间的逻辑。事实上,测试可以归结为:

class ALongRunningTest extends CakeTestCase {
    public $fixtures = array('app.class1', 'app.class2', ... 'app.class8');

    /**
     * @dataProvider provider
     * @test
     */
    public function checkCompositionLogic($val1, $val2, $val3) {
        // internally calls class1 and class3
        $data = $this->ModelX->generateComplexStructure($val1);

        // internally calls other classes & models, which touch the
        // other loaded fixtures
        $results = $this->ModelY->checkAllWhichApply($val2, $data);

        $this->assertEquals($val3, $results);
    }

    public function provider() {
        return array(
            array(stuff, stuff1, stuff2),
            array(x_stuff, x_stuff1, x_stuff2),
            array(y_stuff, y_stuff1, y_stuff2),
            array(z_stuff, z_stuff1, z_stuff2),
            array(a_stuff, a_stuff1, a_stuff2),
            // More test cases
        );
    }
}

我找不到任何关于如何防止这种情况的信息。我在CakeTestCase 类中看到了一个公共变量autoFixtures,并附注说如果将其更改为false,它将不会加载固定装置。它会说明您必须手动加载它们。但是,我没有看到有关如何手动实际加载它们的文档。

【问题讨论】:

  • 我对蛋糕一无所知:您是否必须使用 public $fixtures = array(...); 来设置它并且 CakeTestCase 对这些变量有一些魔力,或者您是否可以控制夹具的创建?
  • 是的,这个问题是关于 Cake 如何与 PHPUnit 一起工作的。使用CakeTestCase 类,$fixtures 是一个预期的数组,列出了所有要加载的Fixture 类。然后它会执行一些魔法来加载所有内容。这种“魔法”是我无法追踪或阅读文档以确定如何手动加载内容的原因。

标签: phpunit cakephp-2.0


【解决方案1】:

严格来说,CakePHP 的工作方式是正确的。测试不应相互依赖,以便在每个测试用例之间重置数据库。您甚至可以争辩说应该在每个测试方法之间重置它,但是开销会更加明显。

但是,由于您正在对数据库执行只读操作,因此您可以删除测试用例中对固定装置的所有引用,并在运行测试套件之前设置您的数据库条目(例如,从 SQL 文件中导入它) .

或者您可以创建一个自定义测试套件来添加整个数据负载,例如:

class AllTest extends CakeTestSuite {
    public static function suite() {
        self::loadDB();
        $suite = new CakeTestSuite('All tests');
        $suite->addTestDirectoryRecursive(TESTS . 'Case');
        return $suite;
    }
    public static function loadDB() {
         //Do some set up here using your models
    }
}

这样做的好处是,如果您不得不引入确实写入数据库的测试,您可以在单独的测试套件下运行它们。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-07-04
  • 2017-12-02
  • 2014-04-30
  • 2021-04-14
  • 1970-01-01
  • 2014-12-25
  • 2012-09-18
  • 1970-01-01
相关资源
最近更新 更多