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/phpunit
和 drupal/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
参考资料