web-dev-qa-db-fra.com

Comment exécuter les tests PHPUnit?

Drupal 8 complète le framework de test basé sur Simpletest avec PHPUnit , et Simpletest pourrait être supprimé in Drupal 9.

Je ne mets pas encore à niveau vers Drupal 8, mais je me demandais comment écrire des tests existants dans PHPUnit (pour suivre la tendance) pour Drupal = 7, à la place dans Simpletest?

Existe-t-il une méthode ou un module pour intégrer PHPUnit avec Drupal 7?

Il y en a peu comme phpunit ou drunit , mais ils ne sont pas pour Drupal 7.

12
kenorb

Vous pouvez exécuter des tests PHPUnit en démarrant Drupal dans chacun de vos fichiers de test. Ce n'est pas idéal, mais cela fonctionne.

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 fournit une belle API pour construire les objets, contrairement au test simple de Drupal. Il y a ne bibliothèque disponible dans Gist pour intégrer PHPUnit avec Drupal 7 .
Pour exécuter ces scripts, vous devez vérifier ceci Gist-repository . Pour exécuter des tests unitaires dans la ligne de commande, accédez simplement à un site Drupal (c.-à-d. <DRUPAL_ROOT>/sites/default) et utilisez dphpunit.bash comme vous utiliseriez la commande phpunit.

Le script se compose de 3 fichiers:

  1. dphpunit.bash - qui invoque simplement drun-dphpunit.php avec quelques paramètres supplémentaires. C'est nécessaire parce que PHP est incapable de traiter correctement les liens symboliques.
  2. drun-dphpunit.php - qui est fondamentalement le même que le runner phpunit en amont, sauf qu'il gère le paramètre supplémentaire.
  3. bootstrap.inc.php - ce qui fait un Drupal bootstrap très similaire à bourdonnement.

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

Il existe une autre bibliothèque disponible pour l'intégration PHPUnit avec Drupal 7: https://github.com/sebastianbergmann/phpunit

Plus d'informations sur ces scripts peuvent être vérifiées ici: http://thomaslattimore.com/blog/using-phpunit-with-drupal-7

3
Ankit Agrawal

Il existe une solution de contournement avec le fichier de configuration.

  1. Créez le fichier phpunit.xml.dist dans votre racine de projet drupal. Vous devez contenir ce
<?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 doit bootstrap notre drupal. Créer drupal phpunit bootstrap. Je préfère le nommer 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

C'est tout. Vous pouvez maintenant démarrer vos tests de plusieurs manières.

1. CLI

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

où:

  • - c : définit le fichier de configuration.
  • QuestionValidationValueOptionsInputTest et chemin : définit le nom de la classe de test et son chemin d'accès.

2. IDE (phpstorm)

Vous devez ajouter la configuration de test de fonctionnement

Test run configuration

Et pas besoin d'inclure drupal bootstrap code dans chaque test).

Remarque

Vous pouvez avoir des problèmes avec les tests en raison d'une mauvaise version php de votre environnement.

Lectures complémentaires:

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

1
David Permanov