作者: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命令扩大测试范围。
(翻译不妥之处,请在留言处纠正,本人会在第一时间修改!)