¿Cómo ejecutar pruebas PHPUnit?

12

Drupal 8 está complementando el marco de prueba basado en Simpletest con PHPUnit , y Simpletest podría eliminarse en Drupal 9.

Todavía no estoy actualizando a Drupal 8, pero me preguntaba cómo puedo escribir las pruebas existentes en PHPUnit (para seguir la tendencia) para Drupal 7, en lugar de en Simpletest.

¿Hay algún método o módulo para integrar PHPUnit con Drupal 7?

Hay pocos como phpunit o drunit , pero no son para Drupal 7.

kenorb
fuente
1
Solo quiero echar a Behat por ahí. Es ideal para hacer escenarios de prueba del mundo real (no realmente pruebas unitarias): drupal.org/project/drupalextension Una vez que lo configura, hace que probar la funcionalidad de Drupal sea muy fácil. Estamos ejecutando Behat en un entorno de CI y ¡nos encanta!
donutdan4114
@ donutdan4114 ¿puede proporcionar más información o un video instructivo que muestre cómo logra esto con Drupal? Estoy muy interesado.
zkent

Respuestas:

11

Puede ejecutar las pruebas de PHPUnit iniciando Drupal dentro de cada uno de sus archivos de prueba. No es ideal, pero funciona.

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
fuente
44
Si necesita hacer esto, lo que está escribiendo no son pruebas unitarias, y probablemente debería usar DrupalWebTestCase desde el módulo de prueba central basado en SimpleTest.
matt2000
@ matt2000 sí y espere horas hasta que las pruebas terminen ...
Codium
3

PHPUnit proporciona una buena API para construir los objetos, mientras que la más simple de Drupal no. Hay una biblioteca disponible en gist para integrar PHPUnit con Drupal 7 .
Para ejecutar esos scripts, debe verificar este repositorio esencial . Para ejecutar Pruebas unitarias en la línea de comandos, simplemente vaya a un sitio de Drupal (es decir <DRUPAL_ROOT>/sites/default) y use dphpunit.bash tal como usaría el comando phpunit.

El script consta de 3 archivos:

  1. dphpunit.bash , que simplemente invoca drun-dphpunit.php con algunos parámetros adicionales. Es necesario porque PHP es incapaz de manejar correctamente los enlaces simbólicos.
  2. drun-dphpunit.php , que es básicamente lo mismo que el phpunit runner ascendente, excepto que maneja el parámetro adicional.
  3. bootstrap.inc.php : lo que hace que un bootstrap de Drupal sea muy similar a drush.

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

Hay una biblioteca más disponible para integración PHPUnit con Drupal 7: https://github.com/sebastianbergmann/phpunit

Puede consultar más información sobre estos scripts aquí: http://thomaslattimore.com/blog/using-phpunit-with-drupal-7

Ankit Agrawal
fuente
55
Lamentablemente, este repositorio se ha ido.
sheldonkreger
2
-1 porque la esencia se ha ido.
cwallenpoole
1

Hay una solución alternativa con el archivo de configuración.

  1. Cree el archivo phpunit.xml.dist en la raíz del proyecto drupal. Tengo que contener esto
<?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 tiene que arrancar nuestra instancia de drupal. Cree el archivo de arranque drupal phpunit. Prefiero llamarlo 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

Eso es todo. Ahora puede comenzar sus pruebas de varias maneras.

1. CLI

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

dónde:

  • -c : define el archivo de configuración.
  • QuestionValidationValueOptionsInputTest y ruta : define el nombre de clase de prueba y la ruta a ella.

2. IDE (tormenta de php)

Debe agregar la configuración de prueba de ejecución

Configuración de prueba de funcionamiento

Y no es necesario incluir el código de arranque de drupal en cada prueba.

Nota

Puede tener problemas con las pruebas debido a la versión incorrecta de php de su entorno.

Otras lecturas:

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

David Permanov
fuente