作者:Ben Dougherty
我最近为drupal8改写了Drush Migrate Manifest命令,这是我第一次介绍怎样写Drush命令测试,过程比我最初想象的痛苦,不过还是有一些事项值得一提。
背景
Drush测试使用PHPUnit作为测试运行器和测试框架,这为许多开发开发者所熟知,尤其是参与drupal8的开发者。Drush使用"Unish"名称作为命名空间和基础测试类。我不知道Unish出自哪里,不过这里有一个定义。
测试框架
使用Lower Camel Case命名的文件和类名称,在测试文件夹内创建你的测试。
<?php
// /drush/tests/migrateManifesteTest.php
namespace Unish;
/**
* @group commands
*/
class migrateManifestTest extends CommandUnishTestCase {
/**
* {@inheritdoc}
*/
public function setUp() {
if (UNISH_DRUPAL_MAJOR_VERSION < 8) {
$this->markTestSkipped('Migrate manifest is for D8');
}
}
}
?>
首先我们要指定前面所提到的Unish命名空间,似乎是所有Drush测试都要如此,我们应当为我们的测试指定一个组,以至于它可以通过Travis获得并运行。现在我们就使用预先存在的“命令”组。我们的类继承了CommandUnishTestCase,它提供所有Drush集成测试中的常用功能。 还要有一个UnitUnishTestCase测试单元。这个特定的基类为我们提供了一个简单的方式来安装drupal并且针对一个测试实例运行Drush命令。最后我们像其他的PHPUnit测试一样用setUp()方法。你可能会注意到有一个常量,它向我们提供针对测试的drupal的主要版本。
安装drupal
唯一需要注意的是:每次你需要调用drush命令时,必须保持站点设置。例如:
<?php
public function setUp() {
if (UNISH_DRUPAL_MAJOR_VERSION < 8) {
$this->markTestSkipped('Migrate manifest is for D8');
}
// Install the standard install profile.
$sites = $this->setUpDrupal(1, TRUE, UNISH_DRUPAL_MAJOR_VERSION, 'standard');
$site = key($sites);
$root = $this->webroot();
$this->siteOptions = array(
'root' => $root,
'uri' => $site,
'yes' => NULL,
);
$this->drush('pm-enable', array('migrate_drupal'), $this->siteOptions);
}
?>
如上代码所示,我们首先安装测试所使用的标准安装文件的Drupal版本。然后为新创建的站点保存数组网站选项。最后,我们来看一个运行Drush命令的例子,这里我们使用新站点选项来启用migrate_drupal模块。
运行测试
Drush附带了一个shell脚本,它引用正确的PHPUnit配置使得运行测试更简单。但是,仍然有一些地方需要了解:
UNISH_NO_TIMEOUTS=1 UNISH_DRUPAL_MAJOR_VERSION=8 ./unish.sh --filter=migrateManifestTest
运行测试时,要多设置主要版本常量,否则我们上面提到的setUp()方法将会失败。其次,我发现没有设置超时,调试时就会遇到很多超时现象。
写我们的第一个测试
闲话少说,让我们看一个实际的测试。
<?php
/**
* Test with a non-existed manifest files.
*/
public function testNonExistentFile() {
$migrate_options = $this->siteOptions + array(
'legacy-db-url' => 'mysql://root:@localhost/db'
);
$args = array('/some/file/that/doesnt/exist');
$this->drush('migrate-manifest', $args, $migrate_options);
$this->assertContains('The manifest file does not exist.', $this->getErrorOutput());
}
?>
你可以看到我们合并附加的选项迁移到了网站选项,这个网站选项针对Drupal站点和使用正确迁移选项来调用migrate-manifest命令,$args指定命令的原始参数,调用上面的输出会看起来像这样:
drush migrate-manifest /some/file/that/doesnt/exist --legacy-db-url='mysql://root@localhost/db'
处理错误
上面并没有多少工作,我们必须辨别$ this - > drush,我们期望有一个错误否则命令将会运行失败。更新你的方法调用。
<?php
$this->drush('migrate-manifest', $args, $this->migrateOptions, NULL, NULL, self::EXIT_ERROR);
?>
现在命令将运行成功,并且我们能够断定这是使用$ this - > getErrorOuput();的正确输出。
结语
本文的大部分内容都是我在第一次进行几小时的Drush测试后整理的,我很高兴听到有人可以给我提出改进建议,或许我会在后续几周里为新的Drush Migrat命令扩大测试范围。
(翻译不妥之处,请在留言处纠正,本人会在第一时间修改!)