Come eseguire i test PHPUnit?


12

Drupal 8 sta completando il framework di test basato su Simpletest con PHPUnit e Simpletest potrebbe essere rimosso in Drupal 9.

Non sto ancora aggiornando a Drupal 8, ma mi chiedevo come posso scrivere i test esistenti in PHPUnit (per seguire la tendenza) per Drupal 7, invece in Simpletest?

Esiste un metodo o un modulo per integrare PHPUnit con Drupal 7?

Ci sono pochi come phpunit o drunit , ma non sono per Drupal 7.


1
Voglio solo lanciare Behat là fuori. È ottimo per fare scenari di test nel mondo reale (non in realtà test unitari): drupal.org/project/drupalextension Una volta che hai configurato, rende il test della funzionalità Drupal un gioco da ragazzi. Stiamo eseguendo Behat in un ambiente CI e lo adoriamo!
donutdan4114,

@ donutdan4114 puoi fornire qualche informazione in più o un video didattico che mostri come realizzi questo con Drupal? Sono molto interessato.
zkent,

Risposte:


11

Puoi far eseguire i test PHPUnit eseguendo il bootstrap di Drupal all'interno di ciascuno dei tuoi file di test. Non è l'ideale, ma funziona.

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 {
  ...

4
Se è necessario eseguire ciò, ciò che si sta scrivendo non sono Test unit, e probabilmente si dovrebbe semplicemente usare DrupalWebTestCase dal modulo di test di base basato su SimpleTest.
matt2000,

@ matt2000 sì e aspetta ore fino al termine dei test ...
Codium,

3

PHPUnit fornisce una bella API per costruire gli oggetti, mentre il più semplice di Drupal no. C'è una libreria disponibile in sintesi per l'integrazione di PHPUnit con Drupal 7 .
Per eseguire quegli script devi controllare questo repository gist . Per eseguire Unit-Test nella riga di comando, vai semplicemente su un sito Drupal (es. <DRUPAL_ROOT>/sites/default) E usa dphpunit.bash proprio come faresti con il comando phpunit.

Lo script è composto da 3 file:

  1. dphpunit.bash - che semplicemente invoca drun-dphpunit.php con alcuni parametri extra. È necessario perché PHP non è in grado di gestire correttamente i collegamenti simbolici.
  2. drun-dphpunit.php - che è sostanzialmente lo stesso del runner phpunit a monte, tranne per il fatto che gestisce il parametro extra.
  3. bootstrap.inc.php - che rende un bootstrap Drupal molto simile a drush.

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

C'è un'altra libreria disponibile per l'integrazione PHPUnit con Drupal 7: https://github.com/sebastianbergmann/phpunit

Ulteriori informazioni su questi script possono essere verificate qui: http://thomaslattimore.com/blog/using-phpunit-with-drupal-7


5
Purtroppo, questo repository è sparito.
sheldonkreger,

2
-1 perché l'essenza è sparita.
cwallenpoole,

1

Esiste una soluzione alternativa con il file di configurazione.

  1. Creare il file phpunit.xml.dist nella radice del progetto drupal. Devo contenere questo
<?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 deve avviare la nostra istanza di drupal. Crea il file bootstrap drupal phpunit. Preferisco chiamarlo 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

È tutto. Ora puoi iniziare i test in diversi modi.

1. CLI

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

dove:

  • -c : definisce il file di configurazione.
  • QuestionValidationValueOptionsInputTest e path : definisce il nome della classe di test e il percorso.

2. IDE (phpstorm)

Devi aggiungere la configurazione di esecuzione del test

Configurazione di prova

E non è necessario includere il codice bootstrap drupal in ogni test.

Nota

Potresti avere problemi con i test a causa della versione php errata del tuo ambiente.

Ulteriori letture:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.