本章节阐述了如何为drupal内核升级编写测试代码,包括:
- 重大内核版本升级(如,从7.x到8.x)
- 小版本内核升级(如,从7.10到7.12)。
升级测试需要数据库dump
升级测试就是一个“普通”的测试,除了它不需要进行新数据库安装。他们需要先导入一份老druapl版本的数据库dump。回顾现行的升级有:
数据库导出使用PHP文件,通过数据库API接口来创建希望的后端schemas和数据。举例如下:
测试可以用到这些dump的任何一个,甚至可以加载一系列的dump来做复杂的设置。请参阅下面详细信息。
数据库的dump可以用gzip来压缩,但不是必须的。Drupal 7大多采用一般的PHP文件。在撰写本文是,Drupal8已只采用.gz压缩文件。gzip压缩的文件很难做diff,但是check out和发布时文件要小的多。
创建测试用的数据库dump文件
数据库dump文件是些php文件,通过数据库API接口文件来创建所要schema和导入所需数据。这些文件可以从一个已安装的Drupal数据库用内核中的脚本来生成。
创建数据库dump的步骤
1. 首先检查是否在Drupal7或Drupal8升级测试中已有合适的供升级的dump组件(如果适用的话)。
2. 用测试需要的最低限度的更改来配置Drupal。比如,你需要为某个特别模块增加测试,就启用并配置该模块。
3. 用适当的shell脚本来生成新的数据库dump。
4.将数据库dump添加到你的patch中。
请注意,你可以通过在已有的完整的dump上,生成仅含有和该模块相关数据的第二份文件,来为另外的模块添加测试。例如:参阅drupal-6.comments.database.php。该dump文件需要drupal-6.filled.database.php来安装drupal,然后可以简单地为测试添加额外的注释数据。
创建新数据库dumps的Shell脚本
在运行脚本前,假定你已经安装了Drush.安装指南请参阅Drush的README.txt文件。
# Remove any previous installation of Drupal in the druapl-dumps directory.
rm -rf drupal-dumps/drupal
# Download the latest D7, place it in 'drupal-dumps' directory,
# rename the downloaded directory 'drupal'.
drush dl drupal-7.x --destination=drupal-dumps --drupal-project-rename=drupal
cd drupal-dumps/drupal
# Install Drupal site using the standard profile
# and create an SQLite database.
drush site-install -y standard --account-name=admin --account-pass=drupal --db-url=sqlite:./.ht.drupal.sqlite
# enable all core modules
drush pml --core --status="not installed" --pipe | xargs drush en --yes
# Create a database dump of the empty Drupal site.
php scripts/dump-database-d7.sh > ../d7.standard.bare.php
# Generate content in the Drupal site.
php scripts/generate-d7-content.sh
# Create a database dump of the Drupal site.
php scripts/dump-database-d7.sh > ../d7.standard.filled.php
写升级测试
从UpgradePathTestCase扩展测试类
要测试已有的实用功能(如更容易的加载数据库dump, 运行update.php等),需要从基本升级路径类扩展你的测试类,提供getInfo()方法如其他测试方法一样。以Drupal7的upgrade.commment.test为例
<?php
/**
* Tests the upgrade path for the Comment module.
*/
class CommentUpgradePathTestCase extends UpgradePathTestCase {
public static function getInfo() {
return array(
'name' => 'Comment upgrade path',
'description' => 'Comment upgrade path tests.',
'group' => 'Upgrade path',
);
}
// ...
}
?>
升级测试的setupUp()方法
测试可以使用任何一个已有的dump,甚至用复杂的配置,加载一系列dumps来测试系统。如上所述,upgrade.comment.php同时加载数据库dump和自己的注释数据库dump来准备环境。
<?php
public function setUp() {
// Path to the database dump files.
$this->databaseDumpFiles = array(
drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-6.filled.database.php',
drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-6.comments.database.php',
);
parent::setUp();
// ...
}
?>
将升级方法运用到测试实例
一旦升级测试的setUp()方法从dump php文件导入了数据库dump,测试方法就可以编写功能测试了。但是要确保在升级前,先在测试函数中进行升级,和/或者进行数据的更改。upgrade.locale.test文件枚举了大量的例子。
<?php
/**
* Tests an upgrade with path-based negotiation.
*/
public function testLocaleUpgradePathDefault() {
// LANGUAGE_NEGOTIATION_PATH_DEFAULT.
$this->variable_set('language_negotiation', 1);
$this->assertTrue($this->performUpgrade(), 'The upgrade was completed successfully.');
// The home page should be in French.
$this->assertPageInLanguage('', 'fr');
// The language switcher block should be displayed.
$this->assertRaw('block-locale-language', 'The language switcher block is displayed.');
// The French prefix should not be active because French is the default language.
$this->drupalGet('fr');
$this->assertResponse(404);
// The English prefix should be active.
$this->assertPageInLanguage('en', 'en');
}
?>
其中,$this->performUpgrade() 函数部分是实现升级运行,这样你的升级方法得到了一个升级环境。这里,我们在执行升级前,进行不同的设置,这样就可以测试升级。