Jak uruchomić testy PHPUnit?

12

Drupal 8 uzupełnia framework testowy oparty na Simpletest o PHPUnit , a Simpletest można usunąć w Drupal 9.

Nie aktualizuję jeszcze do Drupal 8, ale zastanawiałem się, jak napisać istniejące testy w PHPUnit (aby podążać za trendem) dla Drupal 7 zamiast w Simpletest?

Czy jest jakaś metoda lub moduł do integracji PHPUnit z Drupal 7?

Istnieje kilka takich jak phpunit lub drunit , ale nie są one przeznaczone dla Drupal 7.

kenorb
źródło
1
Po prostu chcę tam wyrzucić Behata. Jest świetny do wykonywania rzeczywistych scenariuszy testowych (a nie do testów jednostkowych): drupal.org/project/drupalextension Po skonfigurowaniu sprawia, że ​​testowanie funkcji Drupala jest dziecinnie proste. Prowadzimy Behat w środowisku CI i uwielbiamy to!
donutdan4114
@ donutdan4114 czy możesz podać więcej informacji lub film instruktażowy pokazujący, jak to osiągnąć dzięki Drupal? Jestem bardzo zainteresowany.
zkent

Odpowiedzi:

11

Możesz uruchomić testy PHPUnit, ładując Drupala w każdym z plików testowych. To nie jest idealne, ale działa.

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
źródło
4
Jeśli musisz to zrobić, to, co piszesz, nie są Testami Jednostkowymi i prawdopodobnie powinieneś po prostu użyć DrupalWebTestCase z podstawowego modułu testującego opartego na SimpleTest.
matt2000
@ matt2000 tak i poczekaj godziny, aż testy się
zakończą
3

PHPUnit zapewnia ładne API do budowania obiektów, podczas gdy najprostszy Drupal nie. W gist dostępna jest jedna biblioteka do integracji PHPUnit z Drupal 7 .
Aby wykonać te skrypty, musisz sprawdzić to repozytorium gist . Aby wykonać testy jednostkowe w wierszu poleceń, po prostu przejdź do strony Drupal (tj. <DRUPAL_ROOT>/sites/default) I użyj dphpunit.bash, tak jak zrobiłbyś to z poleceniem phpunit.

Skrypt składa się z 3 plików:

  1. dphpunit.bash - który po prostu wywołuje drun-dphpunit.php z kilkoma dodatkowymi parametrami. Jest to potrzebne, ponieważ PHP nie jest w stanie poprawnie obsługiwać dowiązań symbolicznych.
  2. drun-dphpunit.php - który jest w zasadzie taki sam jak poprzedni moduł uruchamiający phpunit, z tym wyjątkiem, że obsługuje dodatkowy parametr.
  3. bootstrap.inc.php - co czyni bootstrap Drupala bardzo podobnym do drusha.

Źródło: 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']);

Dostępna jest jeszcze jedna biblioteka do integracji PHPUnit z Drupal 7: https://github.com/sebastianbergmann/phpunit

Więcej informacji o tych skryptach można sprawdzić tutaj: http://thomaslattimore.com/blog/using-phpunit-with-drupal-7

Ankit Agrawal
źródło
5
Niestety, tego repozytorium już nie ma.
sheldonkreger
2
-1, ponieważ zniknęła istota.
cwallenpoole,
1

Istnieje obejście problemu z plikiem konfiguracyjnym.

  1. Utwórz plik phpunit.xml.dist w katalogu głównym projektu drupal. Muszę to powstrzymać
<?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 musi uruchomić naszą instancję drupala. Utwórz plik startowy Drupal phpunit. Wolę nazywać to 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);

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

To wszystko. Teraz możesz rozpocząć testy na kilka sposobów.

1. CLI

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

gdzie:

  • -c : definiuje plik konfiguracyjny.
  • QuestionValidationValueOptionsInputTest i ścieżka : Definiuje nazwę klasy testowej i ścieżkę do niej.

2. IDE (phpstorm)

Musisz dodać konfigurację testową

Konfiguracja uruchomienia testowego

I nie ma potrzeby dołączania kodu startowego Drupal do każdego testu.

Uwaga

Możesz mieć problemy z testami z powodu niewłaściwej wersji php twojego środowiska.

Dalsza lektura:

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

David Permanov
źródło