如何防止在使用CakePHP和PHPUnit的测试之间重新加载Fixtures

时间:2011-12-13 22:09:18

标签: phpunit cakephp-2.0

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

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

所有测试仅作为READ使用。我们只是发出对数据库的查找调用,并根据这些结果在一组类交互中测试逻辑。事实上,测试可以归结为:

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则不会加载灯具。它会说明您必须手动加载它们。但是,我没有看到关于如何实际手动加载它们的文档。

1 个答案:

答案 0 :(得分:2)

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

但是,由于您在数据库上执行只读操作,因此可以在运行测试套件之前删除测试用例中对fixture的所有引用并设置数据库条目(例如,从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
    }
}

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