Pregunta

He empezado a usar PHPUnit, pero me he encontrado con un poco de un inconveniente.

Mi código utiliza $ _SERVER [ 'DOCUMENT_ROOT'] para calcular rutas para incluye, que funciona cuando mi servidor Apache es el que se usa PHP, pero DOCUMENT_ROOT no se establece cuando corro PHPUnit desde la línea de comandos con "Pruebas PHPUnit", por lo que estos incluyen no funcionan.

Me estoy perdiendo algo en la configuración de PHPUnit? En caso de que de alguna manera se integrará con apache?

¿Fue útil?

Solución

Respuesta tarde, lo siento.

No, no estás perdiendo nada. PHP CLI (PHP para la línea de comandos) es una bestia diferente de PHP como un módulo de Apache / CGI.

Lo que podría hacer, sin embargo, es cambiar el setUp() de sus archivos para establecer $_SERVER['DOCUMENT_ROOT'] a lo que necesita (desde $_SERVER aún está disponible como un superglobal incluso en el contexto de la CLI), por ejemplo, :

public function setUp() {
  $_SERVER['DOCUMENT_ROOT'] = dirname(__FILE__) . "/../application";
}

Sólo tenga cuidado, es probable que desee poner esto en su tearDown():

public function tearDown() {
  unset($_SERVER['DOCUMENT_ROOT']);
}

PHPUnit copias de seguridad de estado global si utiliza los datos globales (también superglobal) en absoluto, lo que puede ralentizar sus pruebas de manera espectacular, por lo tanto, por qué es mejor para no tener ninguna después de una prueba se haya colado.

Otros consejos

En lugar de inyectar los cortes en el código de producción o para probar el código, puede configurar variables adicionales directamente en phpunit.xml (que se van a utilizar en algún momento de todos modos) en la sección php:

<phpunit bootstrap="vendor/autoload.php">

    <php>
        <server name="DOCUMENT_ROOT" value="wwwroot" />
        <server name="SERVER_NAME" value="localhost" />

        <const name="PHPUNIT_TESTSUITE" value="true"/>
    </php>
</phpunit>

Consulte oficial de información sobre las opciones posibles

$_SERVER['DOCUMENT_ROOT'] también se puede configurar en el archivo Bootstrap y el mismo Bootstrap_test.php está unido a la phpunit.xml archivo de configuración PHPUnit con el nombre del atributo bootstrap=Bootstrap_test.php

Yo era capaz de cumplir el requisito de establecer $ _SERVER [ 'DOCUMENT_ROOT'] para la configuración del trabajo de Jenkins. El "Bootstrap_test.php" se parece a

<phpunit

   backupGlobals="false"

   backupStaticAttributes="false"

   strict="true"

   verbose="true"

   bootstrap="Bootstrap_test.php">

   <testsuites>

     <testsuite name="PHPUnit Test Suite">

     <file>PHPUnitTest.php</file>

     </testsuite>

   </testsuites>

   <logging>

     <log type="coverage-clover" target="logs/clover.xml"/>

   </logging>

</phpunit>

y el contenido en Bootstrap.php se declara utilizando la función define():

define('BASE_PATH', realpath(dirname(__FILE__)));    
$_SERVER['DOCUMENT_ROOT'] = BASE_PATH;

La variable BASE_PATH normalmente contendrá la ruta completa del directorio de trabajo de Jenkins. Por ejemplo, Jenkins nombre del trabajo es Test_Job. El directorio donde Jenkins colocará código fuente del proyecto se /var/lib/jenkins/jobs/Test_Job/workspace (suponiendo Jenkins directorio de trabajo como /var/lib/jenkins).

Si Bootstrap_test.php se coloca en el directorio base, BASE_PATH llevará a cabo /var/lib/jenkins/jobs/Test_Job/workspace y finalmente se establece en $_SERVER['DOCUMENT_ROOT'].

La mejor forma sería la de desacoplar el código de la utilización de la $_SERVER o cualquier otra matriz global. Por ejemplo hacer

class MyClass
{
    protected $_docroot;

    public function __construct($docroot)
    {
        $this->_docroot = $docroot;
    }

    public function getDocRoot() 
    {
        return $this->_docroot;
    }
}

en lugar de

class MyClass
{
    public function getDocRoot() 
    {
        return $_SERVER['DOCUMENT_ROOT'];
    }
}

Esto le permite hacer

// in your actual code
$instance = new MyClass($_SERVER['DOCUMENT_ROOT']);
$docroot = $instance->getDocRoot();

// in your test
$instance = new MyClass($variable_holding_the_correct_path);
$docroot = $instance->getDocRoot();

Tenga en cuenta que esto es sólo un ejemplo sencillo de desacoplamiento. Podría ser mucho más complicado en su caso -. Pero por lo general vale la pena el esfuerzo, especialmente si'r ejecutar pruebas unitarias

Sólo quiero documentar Llamar a otro archivos php (como config.php) desde el interior pruebas PHPUnit.
Tengo una clase de prueba:

class xyzTest extends TestCase {

    public static function setUpBeforeClass() {
        require_once __DIR__ . '/../../app/config/Config.php';
    }

...

En config.php puedo configurar algunas constantes, al igual que las rutas de archivos. Estas rutas son relativas a $_SERVER['DOCUMENT_ROOT'].
Quiero probar mi clase xyz usando estas constantes de trayectoria.
Sin embargo, el superglobal $_SERVER está vacía, cuando se llama a PHPUnit de línea de comandos. Probé siguiendo el buen consejo de un respuesta anterior y establecer el $_SERVER['DOCUMENT_ROOT'] en los métodos PHPUnits setUp. Esto no se soluciona mi problema.

Me fijo mediante la adición de una declaración if en mi Config.php, así:

if ($_SERVER['DOCUMENT_ROOT']) {
    $DocumentRoot = realpath($_SERVER['DOCUMENT_ROOT']);
} else {
    $DocumentRoot = realpath(dirname(__FILE__) . '/../..'); //for PHPUnit
}

Espero que esto ahorra a alguien dolor de cabeza.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top