PHPUnitテストを実行する方法は?


12

Drupalの8が補充されているに基づいてテストフレームワークSimpleTestのPHPUnitのを、そしてSimpleTestのをすることができる除去のDrupal 9。

まだDrupal 8にアップグレードしていませんが、SimpletestではなくDrupal 7の既存のテストをPHPUnitで(トレンドのフォローアップのために)どうやって書くことができるのでしょうか?

PHPUnitとDrupal 7を統合するための方法やモジュールはありますか?

phpunitdrunitなどはほとんどありませんが、Drupal 7用ではありません。


1
Behatを放り出したいだけです。実際のテストシナリオ(実際には単体テストではありません)を実行するのに最適です:drupal.org/project/drupalextensionセットアップが完了すると、Drupal機能のテストが簡単になります。私たちはCI環境でBehatを実行していますが、それが大好きです!
donutdan4114 14

@ donutdan4114では、Drupalを使用してこれをどのように達成するかを示す詳細情報や説明ビデオを提供できますか?興味深い。
-zkent

回答:


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いややテストまでの待機時間が終了...
ミル属

3

PHPUnitはオブジェクトを構築するための素晴らしいAPIを提供しますが、Drupalのsimpletestは提供しません。PHPUnitとDrupal 7を統合するために、要点で利用可能なライブラリ1つあります
これらのスクリプトを実行するには、このgist-repositoryをチェックアウトする必要があります。コマンドラインで単体テストを実行するには、Drupalサイト(<DRUPAL_ROOT>/sites/default)に移動し、phpunitコマンドを使用するのと同じようにdphpunit.bashを使用します。

スクリプトは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の統合に使用できるライブラリがもう1つあります:https : //github.com/sebastianbergmann/phpunit

このスクリプトの詳細については、http//thomaslattimore.com/blog/using-phpunit-with-drupal-7で確認できます。


5
悲しいことに、このレポはなくなりました。
シェルドンクレガー

2
-1要旨がなくなったため。
cwallenpoole

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 and path:テストクラス名とパスを定義します。

2. IDE(phpstorm)

テスト実行構成を追加する必要があります

テスト実行構成

また、すべてのテストにdrupalブートストラップコードを含める必要はありません。

注意

環境のPHPバージョンが間違っているため、テストに問題がある可能性があります。

参考文献:

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.