Comment exécuter les tests PHPUnit?

12

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

Je ne suis pas encore passé à Drupal 8, mais je me demandais comment écrire des tests existants dans PHPUnit (pour suivre la tendance) pour Drupal 7, plutôt dans Simpletest?

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

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

Kenorb
la source
1
Je veux juste jeter Behat là-bas. C'est génial pour faire des scénarios de test du monde réel (pas vraiment des tests unitaires): drupal.org/project/drupalextension Une fois que vous l'avez configuré, cela rend le test de la fonctionnalité Drupal un jeu d'enfant. Nous exécutons Behat dans un environnement CI et nous l'adorons!
donutdan4114
@ donutdan4114 pouvez-vous fournir plus d'informations ou une vidéo pédagogique montrant comment vous y parvenez avec Drupal? Je suis très intéressé.
zkent

Réponses:

11

Vous pouvez exécuter des tests PHPUnit en amorçant Drupal dans chacun de vos fichiers de test. Ce n'est pas idéal, mais ça marche.

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
la source
4
Si vous devez le faire, ce que vous écrivez ne sont pas des tests unitaires, et vous devriez probablement simplement utiliser DrupalWebTestCase à partir du module de test de base basé sur SimpleTest.
matt2000
@ matt2000 oui et attendez des heures jusqu'à la fin des tests ...
Codium
3

PHPUnit fournit une belle API pour construire les objets, contrairement au test simple de Drupal. Il y a une bibliothèque disponible dans gist pour intégrer PHPUnit avec Drupal 7 .
Pour exécuter ces scripts, vous devez extraire ce référentiel gist . Pour exécuter des tests unitaires en ligne de commande, allez simplement sur un site Drupal (ie. <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 appelle simplement drun-dphpunit.php avec quelques paramètres supplémentaires. C'est nécessaire car PHP est incapable de gérer 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 rend un bootstrap Drupal très similaire à drush.

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 consultées ici: http://thomaslattimore.com/blog/using-phpunit-with-drupal-7

Ankit Agrawal
la source
5
Malheureusement, ce repo a disparu.
sheldonkreger
2
-1 parce que l'essentiel est parti.
cwallenpoole
1

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

  1. Créez le fichier phpunit.xml.dist dans la racine de votre projet drupal. Je dois contenir ça
<?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 amorcer notre instance drupal. Créez un fichier d'amorçage drupal phpunit. 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 path : 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

Configuration de l'exécution de test

Et pas besoin d'inclure du code d'amorçage drupal 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

David Permanov
la source