你在这里

写升级测(Drupal 7/8)

本章节阐述了如何为drupal内核升级编写测试代码,包括:

  • 重大内核版本升级(如,从7.x到8.x)
  • 小版本内核升级(如,从7.10到7.12)。

升级测试需要数据库dump

升级测试就是一个“普通”的测试,除了它不需要进行新数据库安装。他们需要先导入一份老druapl版本的数据库dump。回顾现行的升级有:

数据库导出使用PHP文件,通过数据库API接口来创建希望的后端schemas和数据。举例如下: 

  • drupal-6.bare.database.php 含有schemas的大量dump,但是含的数据不多
  • drupal-6.comments.database.php 含有具体的注释测试的数据。
  • 测试可以用到这些dump的任何一个,甚至可以加载一系列的dump来做复杂的设置。请参阅下面详细信息。

    数据库的dump可以用gzip来压缩,但不是必须的。Drupal 7大多采用一般的PHP文件。在撰写本文是,Drupal8已只采用.gz压缩文件。gzip压缩的文件很难做diff,但是check out和发布时文件要小的多。

    创建测试用的数据库dump文件

    数据库dump文件是些php文件,通过数据库API接口文件来创建所要schema和导入所需数据。这些文件可以从一个已安装的Drupal数据库用内核中的脚本来生成。

    创建数据库dump的步骤

    1. 首先检查是否在Drupal7或Drupal8升级测试中已有合适的供升级的dump组件(如果适用的话)。

  • 如果有合适的数据库dump存在,用该dump来安装 Drupal。(许多情况下,你可以简单的通过阅读klausi'的博客来选择其中一种方法来完成)。
  • 如果没有合适的dump存在,或者你在已有的配置上需要增加其他的测试,则通常需要安装Drupal的预升级版本。
  • 2. 用测试需要的最低限度的更改来配置Drupal。比如,你需要为某个特别模块增加测试,就启用并配置该模块。

    3. 用适当的shell脚本来生成新的数据库dump

  • 对于Drupal7->8,采用core/scripts/dump-database-d7.sh
  • 对于For Drupal 6 -> 7, 用scripts/dump-database-d6.sh
  • 4.将数据库dump添加到你的patch中

  • 如果你产生的是新文件,则用git add 将该文件添加到patch中.
  • 如果是更新已经的dump,要确保只将需要的更改添加到dump文件。你要手工将这些更改从已经的文件复制到生成的文件中。
  • 如果需要更新的文件已经gziped压缩,则解压dump,进行更改后,再gzip压缩该dump.你必须用git diff --binary来讲所做的修改写入压缩文件中.
  • 请注意,你可以通过在已有的完整的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()方法如其他测试方法一样。
  • 重大版本升级(如,Drupal 6 -> Drupal 7),扩展UpgradePathTestCase。
  • 小版本升级(如,Drupal 7.0 -> 7.x),扩展UpdatePathTestCase。
  • (也可参阅#1430412: 考虑重大版本和小版本升级测试的命名规范

    以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() 函数部分是实现升级运行,这样你的升级方法得到了一个升级环境。这里,我们在执行升级前,进行不同的设置,这样就可以测试升级。