Wie führe ich PHPUnit-Tests durch?

12

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

Ich habe noch kein Upgrade auf Drupal 8 durchgeführt, aber ich habe mich gefragt, wie ich vorhandene Tests in PHPUnit (um dem Trend zu folgen) für Drupal 7 schreiben kann, statt in Simpletest?

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.

Kenorb
quelle
1
Ich will nur Behat da draußen werfen. Es ist großartig, um Testszenarien in der Praxis durchzuführen (nicht wirklich Unit-Tests): drupal.org/project/drupalextension Sobald Sie es eingerichtet haben, wird das Testen der Drupal-Funktionalität zum Kinderspiel. Wir betreiben Behat in einer CI-Umgebung und lieben es!
Donutdan4114
@ donutdan4114 Können Sie weitere Informationen oder ein Anleitungsvideo bereitstellen, das zeigt, wie Sie dies mit Drupal erreichen? Ich bin sehr interessiert.
zkent

Antworten:

11

Sie können PHPUnit-Tests ausführen, indem Sie Drupal in jede Ihrer Testdateien booten. 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 {
  ...
Sheldonkreger
quelle
4
Wenn Sie dies tun müssen, handelt es sich bei dem, was Sie schreiben, nicht um Komponententests, und Sie sollten wahrscheinlich nur DrupalWebTestCase aus dem SimpleTest-basierten Kerntestmodul verwenden.
matt2000
@ matt2000 ja und warte Stunden, bis die Tests beendet sind ...
Codium
3

PHPUnit bietet eine nette API zum Erstellen der Objekte, der einfache Test des Drupal dagegen nicht. In gist ist eine Bibliothek für die Integration von PHPUnit in Drupal 7 verfügbar .
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 ( zB<DRUPAL_ROOT>/sites/default ) und verwenden Sie dphpunit.bash genau so, wie Sie den Befehl phpunit verwenden würden.

Das Skript besteht aus 3 Dateien:

  1. dphpunit.bash - ruft einfach drun-dphpunit.php mit ein paar zusätzlichen Parametern auf. Es wird benötigt, weil PHP nicht in der Lage ist, mit Symlinks richtig umzugehen.
  2. drun-dphpunit.php - das ist im Grunde das Gleiche wie der vorgelagerte phpunit-Runner, außer dass er den zusätzlichen Parameter behandelt.
  3. bootstrap.inc.php - das macht einen Drupal-Bootstrap sehr ähnlich zu 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" "$@"

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 steht eine weitere Bibliothek zur Verfügung: https://github.com/sebastianbergmann/phpunit

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

Ankit Agrawal
quelle
5
Leider ist dieses Repo weg.
Sheldonkreger
2
-1 weil das Wesentliche weg ist.
Cwallenpoole
1

Es gibt eine Problemumgehung für die Konfigurationsdatei.

  1. Erstellen Sie die Datei phpunit.xml.dist im Stammverzeichnis Ihres Drupal-Projekts. Muss das 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 unsere Drupal-Instanz booten. Erstellen Sie eine Drupal Phpunit Bootstrap-Datei. Ich bevorzuge es, drupal_phpunit_bootstrap.php zu nennen
<?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

Konfiguration testen

Und es ist nicht erforderlich, in jeden Test Drupal-Bootstrap-Code einzubeziehen.

Hinweis

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

Weitere Lektüre:

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

David Permanov
quelle