跳转到主要内容
丹麦有童话 提交于 12 December 2014

原文链接

作者: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命令扩大测试范围。

(翻译不妥之处,请在留言处纠正,本人会在第一时间修改!)

标签
Drupal 版本