Drupal 测试

Drupal 8 可以使用 PHPUnit 进行单元测试、内核测试、功能测试/浏览器测试 和 JavaScript 测试。

SimpleTest 测试框架依然可以使用,但不再推荐。

测试类型

测试类型 基础类 用途 Drupal 环境 UI 支持JS
Unit UnitTestCase 独立函数、类、方法的测试
Kernel KernelTestBase 依赖少量 Drupal 内核 API 的测试 有,精简
Functional BrowserTestBase 依赖完整 Drupal 或 UI 的测试
FunctionalJavascript WebDriverTestBase 依赖 JS 的测试

测试目录与测试文件

测试相关的目录和命名空间需遵循 PSR-4 规范,基于 PHPUnit 的测试需放置于对应的模块下的  tests/src/$suite_type 目录,示例:

module/custom/my_module
    |- tests/
        |- src/
            |- Unit/
                |- MyModuleUnitTest.php
            |- Kernel/
                |- MyModuleKernelTest.php
            |- Functional/
                |- MyModuleFunctionalTest.php
            |- FunctionalJavascript/
                |- MyModuleFunctionalJavaScriptTest.php

测试类的命名空间为  \Drupal\Tests\$module\$suite_type ,示例:

namespace \Drupal\Tests\my_module\Unit;
namespace \Drupal\Tests\my_module\Kernel;
namespace \Drupal\Tests\my_module\Functional;
namespace \Drupal\Tests\my_module\FunctionalJavascript;

测试类文件名必须以 Test 结尾,测试类方法必须以 test 开头,示例:

namespace \Drupal\Tests\my_module\Functional;

use Drupal\Tests\BrowserTestBase;

class SomethingTest extends BrowserTestBase {
    public function testSomething() {
        // Your assertions here.
    }
}

测试前准备

运行测试前需要先安装 phpunit/phpunitdrupal/core-dev(需要与 composer.json 中的 drupa/core 版本一致),示例:

composer require --dev drupal/core-dev:^9 phpunit/phpunit:^8

如需进行 Kernel/Functional/FunctionalJavascript 测试,需先完成网站 URL 和数据库等相关配置——进入 core 目录,将 phpunit.xml.dist 复制为 phpunit.xml ,并根据注释说明修改其中的

<!-- Example SIMPLETEST_BASE_URL value: http://localhost -->
<env name="SIMPLETEST_BASE_URL" value=""/>
<!-- Example SIMPLETEST_DB value: mysql://username:[email protected]/databasename#table_prefix -->
<env name="SIMPLETEST_DB" value=""/>
<!-- Example BROWSERTEST_OUTPUT_DIRECTORY value: /path/to/webroot/sites/simpletest/browser_output -->
<env name="BROWSERTEST_OUTPUT_DIRECTORY" value=""/>

运行测试

运行测试前需要先切换到 core 目录(composer 安装的 Drupal 为 /web/core),core 目录下的 phpunit.xml 为测试配置文件。

# 进入 core 目录,其中包含 phpunit.xml 配置文件
cd web/core

# 执行指定测试
../../vendor/bin/phpunit ../module/custom/xxx/tests/src/Unit/xxxTest.php

# 执行所有 Unit 测试
../../vendor/bin/phpunit --testsuite=unit

执行 Functional 测试时如遇到 mkdir() 权限问题,请确保 Web 服务器和执行脚本的用户为非 root 用户,两者位于相同用户组且执行脚本的用户有写入权限,或者以指定用户身份执行脚本,如:

sudu -u apache -E ../../vendor/bin/phpunit ../module/custom/xxx/tests/src/Functional/xxxTest.php

参考:

  • https://deninet.com/blog/2018/12/31/writing-automated-tests-drupal-8-part-1-test-types-and-set#setting-up-the-test-framework
  • https://deninet.com/blog/2019/01/13/writing-automated-tests-drupal-8-part-2-functional-tests

参考资料

单元测试

使用 PHPUnit 进行单元测试

功能测试

功能测试