如何运行PHPUnit测试?


12

Drupal 8PHPUnit 补充了基于Simpletest的测试框架,Simpletest可以在Drupal 9中删除

我还没有升级到Drupal 8,但是我想知道如何在PHPUnit中为Drupal 7编写现有测试(以跟上趋势),而不是在Simpletest中编写?

有没有将PHPUnit与Drupal 7集成的方法或模块?

很少有phpunitdrunit之类的,但它们不适用于Drupal 7。


1
只想把Behat扔出去。这对于进行真实的测试场景(不是真正的单元测试)非常有用:drupal.org/project/drupalextension一旦安装完成,就可以轻松测试Drupal功能。我们在CI环境中运行Behat并喜欢它!
donutdan4114 2014年

@ donutdan4114您能否提供更多信息或教学视频,以显示如何使用Drupal完成此操作?我很感兴趣。
zkent 2015年

Answers:


11

您可以通过在每个测试文件中引导Drupal来运行PHPUnit测试。这不是理想的方法,但是确实有效。

define('DRUPAL_ROOT', 'your/path/to/drupal');
require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
$_SERVER['REMOTE_ADDR'] = '127.0.0.1';

// Bootstrap Drupal.
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

// Proceed with PHPUnit tests as usual from here.
class MyTest extends \PHPUnit_Framework_TestCase {
  ...

4
如果您需要这样做,那么您编写的不是单元测试,您应该只使用基于SimpleTest的核心测试模块中的DrupalWebTestCase。
matt2000

@ matt2000是的,请耐心等待直到测试完成……
Codium

3

PHPUnit为构建对象提供了一个不错的API,而Drupal的simpletest则没有。gist中一个库可用于将PHPUnit与Drupal 7集成
要执行这些脚本,您需要检出该gist-repository。要在命令行中执行单元测试,只需转到Drupal站点(即<DRUPAL_ROOT>/sites/default)并使用dphpunit.bash,就像使用phpunit命令一样。

该脚本包含3个文件:

  1. dphpunit.bash-仅使用一些额外参数调用drun-dphpunit.php。这是必需的,因为PHP无法正确处理符号链接。
  2. drun-dphpunit.php-与上游phpunit运行程序基本相同,只是它处理额外的参数。
  3. bootstrap.inc.php-使Drupal引导程序与drush非常相似。

资料来源:http : //devblog.more-onion.com/content/writing-unit-tests-drupal-7


bootstrap.inc.php

<?php

$path = CWD;

$site_dir = NULL;
$dpl_dir = NULL;

while ($path != '/') {
    if (file_exists($path . '/settings.php')) {
        $site_dir = $path;
    }
    if (file_exists($path . '/index.php') && file_exists($path . '/includes/bootstrap.inc')) {
        $dpl_dir = $path;
        break;
    }
    $path = dirname($path);
}

if (!$dpl_dir) {
    echo "No drupal directory found in or above current working directory. Aborting. \n";
    exit(1);
}
if (!$site_dir) {
    $site_dir = $dpl_dir . '/sites/default';
    if (!file_exists($site_dir . '/settings.php')) {
        echo "No configured site found. Aborting.\n";
        exit(1);
    }
}

$_SERVER['HTTP_HOST'] = basename($site_dir);
$_SERVER['REMOTE_ADDR'] = '127.0.0.1';

define('DRUPAL_ROOT', $dpl_dir);
set_include_path($dpl_dir . PATH_SEPARATOR . get_include_path());
require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

dphpunit.bash

#!/bin/bash

# get dirname of the script
DIR="$(dirname $(readlink "$0"))"

# assume the boostrap script is stored in the same directory
php "$DIR/drun-phpunit.php" "$(pwd)" --bootstrap "$DIR/bootstrap.inc.php" "$@"

drun-phpunit.php

<?php
require_once 'PHP/CodeCoverage/Filter.php';
PHP_CodeCoverage_Filter::getInstance()->addFileToBlacklist(__FILE__, 'PHPUNIT');

if (extension_loaded('xdebug')) {
  xdebug_disable();
}

if (strpos('/usr/bin/php', '@php_bin') === 0) {
  set_include_path(dirname(__FILE__) . PATH_SEPARATOR . get_include_path());
}

require_once 'PHPUnit/Autoload.php';
define('PHPUnit_MAIN_METHOD', 'PHPUnit_TextUI_Command::main');
define('CWD', $_SERVER['argv'][1]);
unset($_SERVER['argv'][1]);

$command = new PHPUnit_TextUI_Command;
$command->run($_SERVER['argv']);

还有一个可用于将PHPUnit与Drupal 7集成的库:https : //github.com/sebastianbergmann/phpunit

有关此脚本的更多信息,请参见此处:http : //thomaslattimore.com/blog/using-phpunit-with-drupal-7


5
可悲的是,这个仓库已经消失了。
sheldonkreger 2015年

2
-1因为要点不见了。
cwallenpoole 2015年

1

有配置文件的解决方法。

  1. 在您的drupal项目根目录中创建phpunit.xml.dist文件。得到包含这个
<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="phpunit.xsd"
         bootstrap="drupal_phpunit_bootstrap.php"
         verbose="true">

</phpunit>
  1. phpunit必须引导我们的drupal实例。创建drupal phpunit引导程序文件。我更喜欢将其命名为drupal_phpunit_bootstrap.php
<?php

$_SERVER['HTTP_HOST'] = 'your.url';
$_SERVER['SCRIPT_NAME'] = '/index.php';
$_SERVER['REMOTE_ADDR'] = '127.0.0.1';
$_SERVER['REQUEST_METHOD'] = 'GET';
$_SERVER['SERVER_NAME'] = NULL;
$_SERVER['SERVER_SOFTWARE'] = NULL;
$_SERVER['HTTP_USER_AGENT'] = NULL;
// Fix for behat drupal instantiation.
define('DRUPAL_ROOT', dirname(realpath(__FILE__)));
require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

要点:https : //gist.github.com/permanovd/cb9c02920c49a29c97653f4f697147b1

就这样。现在,您可以通过多种方式开始测试。

1. CLI

phpunit -c phpunit.xml.dist QuestionValidationValueOptionsInputTest /yoursite.dir/public_html/profiles/standard/modules/some_module/tests/QuestionValidationTest.php

哪里:

  • -c:定义配置文件。
  • QuestionValidationValueOptionsInputTest和path:定义测试类的名称和路径。

2. IDE(phpstorm)

您必须添加测试运行配置

试运行配置

无需在每个测试中都包含drupal引导程序代码。

注意

由于环境的php版本错误,您可能在测试中遇到问题。

进一步阅读:

https://phpunit.de/manual/current/zh/organizing-tests.html

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.