it-swarm.com.de

Wie führe ich PHPUnit-Tests durch?

Drupal 8 ergänzt das Testframework basierend auf Simpletest mit PHPUnit , und Simpletest könnte entfernt in Drupal 9.

Ich aktualisiere noch nicht auf Drupal 8, aber ich habe mich gefragt, wie ich vorhandene Tests in PHPUnit (um dem Trend zu folgen) für Drupal 7 anstatt in Simpletest schreiben kann ?

Gibt es eine Methode oder ein Modul zur Integration von PHPUnit in Drupal 7?

Es gibt nur wenige wie phpunit oder drunit , aber sie sind nicht für Drupal 7.

12
kenorb

Sie können PHPUnit-Tests durch Bootstrapping ausführen lassen Drupal in jeder Ihrer Testdateien. Es ist nicht ideal, aber es funktioniert.

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 {
  ...
11
sheldonkreger

PHPUnit bietet eine nette API zum Erstellen der Objekte, während der einfachste Test des Drupal dies nicht tut. Es gibt eine Bibliothek in Gist zur Integration von PHPUnit in Drupal 7 .
Um diese Skripte auszuführen, müssen Sie dieses Gist-Repository auschecken. Um Unit-Tests in der Kommandozeile auszuführen, gehen Sie einfach zu einer Drupal Site (dh <DRUPAL_ROOT>/sites/default) Und verwenden Sie dphpunit.bash genau wie Sie den Befehl phpunit verwenden würden.

Das Skript besteht aus 3 Dateien:

  1. dphpunit.bash - ruft einfach drun-dphpunit.php mit einigen zusätzlichen Parametern auf. Es wird benötigt, weil PHP nicht in der Lage ist, mit Symlinks richtig umzugehen.
  2. drun-dphpunit.php - Dies ist im Grunde dasselbe wie der Upstream-Phpunit-Runner, außer dass er den zusätzlichen Parameter verarbeitet.
  3. bootstrap.inc.php - wodurch ein Drupal bootstrap sehr ähnlich zu) wird drush.

Quelle: 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" "[email protected]"

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']);

Für die Integration von PHPUnit mit Drupal 7: https://github.com/sebastianbergmann/phpunit steht eine weitere Bibliothek zur Verfügung

Weitere Informationen zu diesen Skripten finden Sie hier: http://thomaslattimore.com/blog/using-phpunit-with-drupal-7

3
Ankit Agrawal

Es gibt eine Problemumgehung mit der Konfigurationsdatei.

  1. Erstellen Sie die Datei phpunit.xml.dist in Ihrem drupal Projektstamm. Muss dies enthalten
<?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 muss bootstrap unsere drupal Instanz. Create drupal Phpunit bootstrap Datei). Ich nenne es lieber 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);

Inhalt: https://Gist.github.com/permanovd/cb9c02920c49a29c97653f4f697147b1

Das ist alles. Jetzt können Sie Ihre Tests auf verschiedene Arten starten.

1. CLI

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

wo:

  • - c : Definiert die Konfigurationsdatei.
  • QuestionValidationValueOptionsInputTest und Pfad : Definiert den Namen der Testklasse und den Pfad dazu.

2. IDE (phpstorm)

Sie müssen eine Testlaufkonfiguration hinzufügen

(Test run configuration

Und es ist nicht erforderlich, drupal bootstrap Code) in jeden Test aufzunehmen.

Hinweis

Möglicherweise haben Sie Probleme mit Tests aufgrund einer falschen PHP-Version Ihrer Umgebung.

Weiterführende Literatur:

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

1
David Permanov