Como executar testes do PHPUnit?

12

O Drupal 8 está complementando a estrutura de teste baseada no Simpletest com PHPUnit , e o Simpletest pode ser removido no Drupal 9.

Ainda não estou atualizando para o Drupal 8, mas queria saber como posso escrever testes existentes no PHPUnit (para acompanhar a tendência) do Drupal 7, em vez do Simpletest?

Existe algum método ou módulo para integrar o PHPUnit ao Drupal 7?

Existem poucos como phpunit ou drunit , mas não são para o Drupal 7.

kenorb
fonte
1
Só quero jogar Behat lá fora. É ótimo para fazer cenários de teste do mundo real (não realmente testes de unidade): drupal.org/project/drupalextension Depois de configurá-lo, torna-se fácil testar a funcionalidade do Drupal. Estamos executando o Behat em um ambiente de CI e adorei!
Donutdan4114 13/09/14
@ donutdan4114, você pode fornecer mais informações ou um vídeo instrutivo mostrando como você consegue isso com o Drupal? Estou muito interessado.
zkent

Respostas:

11

Você pode executar os testes do PHPUnit executando o Drupal dentro de cada um dos seus arquivos de teste. Não é o ideal, mas 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
fonte
4
Se você precisar fazer isso, o que está escrevendo não são testes de unidade e provavelmente deve usar o DrupalWebTestCase no módulo de teste principal do SimpleTest.
matt2000
@ matt2000 sim e horas de espera até que os testes terminou ...
Codium
3

O PHPUnit fornece uma API agradável para construir os objetos, enquanto o teste mais simples do Drupal não. Existe uma biblioteca disponível no gist para integrar o PHPUnit ao Drupal 7 .
Para executar esses scripts, você precisa fazer o checkout deste repositório gist . Para executar testes de unidade na linha de comando, basta ir ao site do Drupal (por exemplo, <DRUPAL_ROOT>/sites/default) e usar o dphpunit.bash da mesma maneira que usaria o comando phpunit.

O script consiste em 3 arquivos:

  1. dphpunit.bash - que simplesmente chama drun-dphpunit.php com alguns parâmetros extras. É necessário porque o PHP é incapaz de lidar com links simbólicos corretamente.
  2. drun-dphpunit.php - que é basicamente o mesmo que o corredor phpunit upstream, exceto que ele lida com o parâmetro extra.
  3. bootstrap.inc.php - que faz com que o Drupal seja muito semelhante ao 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']);

Há mais uma biblioteca disponível para integração do PHPUnit com o Drupal 7: https://github.com/sebastianbergmann/phpunit

Mais informações sobre esses scripts podem ser consultadas aqui: http://thomaslattimore.com/blog/using-phpunit-with-drupal-7

Ankit Agrawal
fonte
5
Infelizmente, este repo se foi.
Sheldonkreger
2
-1 porque a essência se foi.
precisa saber é o seguinte
1

Existe uma solução alternativa com o arquivo de configuração.

  1. Crie o arquivo phpunit.xml.dist na raiz do projeto drupal. Tem que conter isso
<?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. O Phpunit precisa inicializar nossa instância drupal. Crie um arquivo de inicialização drupal phpunit. Eu prefiro chamá- lo 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

Isso é tudo. Agora você pode iniciar seus testes de várias maneiras.

1. CLI

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

Onde:

  • -c : define o arquivo de configuração.
  • QuestionValidationValueOptionsInputTest e path : define o nome da classe de teste e o caminho para ela.

2. IDE (phpstorm)

Você precisa adicionar a configuração de execução de teste

Configuração de execução de teste

E não é necessário incluir o código de inicialização drupal em todos os testes.

Nota

Você pode ter problemas com os testes devido à versão php errada do seu ambiente.

Leitura adicional:

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

David Permanov
fonte