Clases de carga automática en PHPUnit usando Composer y autoload.php
namespaces composer-php (3)
Acabo de instalar PHPUnit versión 3.7.19 de Sebastian Bergmann a través de Composer y escribí una clase que me gustaría probar por unidad.
Me gustaría tener todas mis clases cargadas automáticamente en cada prueba de unidad sin tener que usar include
o require
en la parte superior de mi prueba, ¡pero esto está demostrando ser difícil!
Así es como se ve la estructura de mi directorio (una barra / de seguimiento indica un directorio, no un archivo):
- compositor.json
- composer.lock
- compositor.phar
- lib /
- regresando.php
- pruebas /
- devolverTest.php
- vendedor/
- compartimiento/
- phpunit
- compositor/
- phpunit /
- Symfony /
- autoload.php
- compartimiento/
Mi archivo composer.json incluye lo siguiente:
"require": {
"phpunit/phpunit": "3.7.*",
"phpunit/phpunit-selenium": ">=1.2"
}
Mi archivo de clase regreso.php incluye lo siguiente:
<?php
class Returning {
public $var;
function __construct(){
$this->var = 1;
}
}
?>
Mi archivo de prueba backTest.php incluye lo siguiente:
<?php
class ReturningTest extends PHPUnit_Framework_TestCase
{
protected $obj = null;
protected function setUp()
{
$this->obj = new Returning;
}
public function testExample()
{
$this->assertEquals(1, $this->obj->var);
}
protected function tearDown()
{
}
}
?>
Sin embargo, cuando ./vendor/bin/phpunit tests
desde la línea de comandos, ./vendor/bin/phpunit tests
el siguiente error:
Error fatal de PHP: no se encontró la clase ''Devolviendo'' en /files/code/php/db/tests/returningTest.php en la línea 8
Noté que el composer
produjo un archivo autoload.php
en vendor/autoload.php
pero no estoy seguro si esto es relevante para mi problema.
Además, en algunas otras respuestas sobre Desbordamiento de pila, las personas han mencionado algo sobre el uso de PSR-0 en el compositor y el comando de namespace
en PHP, pero no he tenido éxito en usar ninguna.
¡Por favor ayuda! Solo quiero cargar mis clases automáticamente en PHPUnit para poder usarlas para crear objetos sin preocuparme por include
o require
.
Actualización: 14 de agosto de 2013
Ahora he creado un proyecto de código abierto llamado PHPUnit Skeleton para ayudarlo a comenzar a ejecutar PHPUnit fácilmente para su proyecto.
Bueno, al principio. Debe decirle al autocargador dónde encontrar el archivo php para una clase. Eso se hace siguiendo el estándar PSR-0.
La mejor manera es usar espacios de nombres. El cargador automático busca un archivo Acme/Tests/ReturningTest.php
cuando solicita una clase Acme/Tests/ReturningTest
. Hay algunos grandes tutoriales de espacio de nombres por ahí, solo busca y lee. Tenga en cuenta que el espacio de nombres no es algo que entró en PHP para la carga automática, es algo que se puede usar para la carga automática.
Composer viene con un autocargador PSR-0 estándar (el que está en vendor/autoload.php
). En su caso, quiere decirle al autocargador que busque archivos en el directorio lib
. Luego, cuando use ReturningTest
, buscará /lib/ReturningTest.php
.
Agrega esto a tu composer.json
:
{
...
"autoload": {
"psr-0": { "": "lib/" }
}
}
Más información en la documentación .
Ahora el autocargador puede encontrar las clases que necesita para que PHPunit sepa que hay que ejecutar un archivo antes de ejecutar las pruebas: un archivo de rutina de carga. Puede usar la opción --bootstrap
para especificar dónde se encuentra el archivo de arranque:
$ ./vendor/bin/phpunit tests --bootstrap vendor/autoload.php
Sin embargo, es mejor usar un archivo de configuración de PHPunit :
<!-- /phpunit.xml.dist -->
<?xml version="1.0" encoding="utf-8" ?>
<phpunit bootstrap="./vendor/autoload.php">
<testsuites>
<testsuite name="The project''s test suite">
<directory>./tests</directory>
</testsuite>
</testsuites>
</phpunit>
Ahora, puede ejecutar el comando y detectará automáticamente el archivo de configuración:
$ ./vendor/bin/phpunit
Si coloca el archivo de configuración en otro directorio, debe colocar la ruta a ese directorio en el comando con la opción -c
.
Ninguna de estas respuestas era lo que estaba buscando. Sí, PHPUnit carga archivos de prueba, pero no stubs / fixtures. La respuesta de Chaun Ma no lo corta porque el vendor/bin/phpunit
ya incluye la carga automática, por lo que no hay forma de que una instancia del autocargador empuje más rutas a su pila en ese momento.
Finalmente encontré esto en los documentos:
Si necesita buscar un mismo prefijo en varios directorios, puede especificarlos como una matriz como tal:
{ "autoload": { "psr-0": { "Monolog//": ["src/", "lib/"] } } }
[ Actualización2 ] Otro enfoque alternativo más simple es usar la directiva autoload-dev
en composer.json
( reference ). El beneficio es que no es necesario mantener dos bootstrap.php (uno para prod, uno para dev) solo para poder cargar clases diferentes.
{
"autoload": {
"psr-4": { "MyLibrary//": "src/" }
},
"autoload-dev": {
"psr-4": { "MyLibrary//Tests//": "tests/" }
}
}
[ Actualización ] La respuesta de Wouter J es más completa. Pero el mío puede ayudar a las personas que desean configurar la carga automática del PSR-0 en las tests/
carpeta.
Phpunit escanea todos los archivos con este patrón *Test.php
. Así que no necesitamos cargarlos nosotros mismos. Pero todavía queremos cargar otras clases de soporte bajo tests/
como fixture / stub o algunas clases para padres.
Una forma fácil es ver cómo el proyecto Composer en sí mismo está configurando la prueba de phpunit. En realidad es muy simple. Tenga en cuenta la línea con "bootstrap".
referencia: https://github.com/composer/composer/blob/master/phpunit.xml.dist
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
backupStaticAttributes="false"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false"
syntaxCheck="false"
bootstrap="tests/bootstrap.php"
>
<testsuites>
<testsuite name="Composer Test Suite">
<directory>./tests/Composer/</directory>
</testsuite>
</testsuites>
<groups>
<exclude>
<group>slow</group>
</exclude>
</groups>
<filter>
<whitelist>
<directory>./src/Composer/</directory>
<exclude>
<file>./src/Composer/Autoload/ClassLoader.php</file>
</exclude>
</whitelist>
</filter>
</phpunit>
referencia: https://github.com/composer/composer/blob/master/tests/bootstrap.php
<?php
/*
* This file is part of Composer.
*
* (c) Nils Adermann <[email protected]>
* Jordi Boggiano <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
error_reporting(E_ALL);
$loader = require __DIR__.''/../src/bootstrap.php'';
$loader->add(''Composer/Test'', __DIR__);
La última línea anterior es la carga automática de clases de prueba phpunit bajo el espacio de nombres Compositor / Prueba.