跳转到主要内容
gokookie 提交于 1 May 2012
原文链接http://drupal.org/node/583030

在许多模块中不同的测试实例需要在不同的上下文中运行。比如,一组测试可能需要将测试数据写入数据库;另一组也许需要产生模块表,但找过模块的_install函数。

DrupalWebTestCase和DrupalUnitTestCase 可以扩展来处理这些情况。你可以在modules/simpletest/tests/database_test.test文件中查看这种方法。

集中创建用于测试的样本数据

为了取得一致和节省时间,你可以在一个类中产生所有的样本数据,然后让你的测试实例来继承。

<?php class MyModuleWebTestCase extends DrupalWebTestCase { function setUp() { parent::setUp('mymodule'); // Insert your data into the database here // Use db_insert() etc. Hard coded SQL will affect your actual drupal installation, not your test environment } } class MyModuleExampleTestCase extends MyModuleWebTestCase { // No setUp() function necessary, because the setUp is inherited public static function getInfo() { ... } function testExample() { // Your test(s) here } } ?>

注:在你的父类(MyModuleWebTestCase 以上)不要声明getInfo()或任何测试方法(如:testExample()),否则会产生错误。

模块化你的测试实例

最好的测试实例是小型模块化--在测试实例中,每一种方法如testExample()应该能测试小片代码或功能。

测试数据库不要增加模块安装开销

这是种高级技术,大多数测试者不需要用到。

测试不需要任何数据库功能,只需要扩展DrupalUnitTestCase,但如果需要测试你的模块和数据库的交互而不启用整个模块,你可以使用drupal_install_schema() 函数来创建所需表格。

<?php class MyModuleDatabaseTestCase extends DrupalWebTestCase { function setUp() { // Create the module's tables without running hook_install or hook_enable drupal_install_schema('mymodule'); } } class MyModuleSchemaTestCase extends MyModuleDatabaseTestCase { // No setUp() function necessary, because the setUp is inherited public static function getInfo() { return array( 'name' => 'Database functions test', 'description' => 'Tests CRUD functions', 'group' => 'My Module', ); } /* * Tests that parent class created module tables */ function testSchemaCreated() { // Your test(s) here } } ?>