如何防止扩展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
则不会加载灯具。它会说明您必须手动加载它们。但是,我没有看到关于如何实际手动加载它们的文档。
答案 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
}
}
这样做的好处是,如果你不得不引入写入数据库的测试,你可以在一个单独的测试套件下运行它们。