PHPUnit - 'No se ejecutaron pruebas' cuando se usa el archivo de configuración

89

El problema

Para mejorar la calidad de mi código, he decidido intentar aprender a probar mi código utilizando Unit Testing en lugar de mis mediocres en el mejor de los casos soluciones de prueba.

Decidí instalar PHPUnit usando Composer para una biblioteca personal que me permite lograr funciones de base de datos comunes. Al principio no tenía un archivo de configuración para PHPUnit y cuando ejecuté comandos como:

$ phpunit tests/GeneralStringFunctions/GeneralStringFunctionsTest

Tenga en cuenta que este es un comando de terminal, por lo que no incluí la .phpextensión. El GeneralStringFunctionsTest mencionado anteriormente es en realidad un GeneralStringFunctionsTest.phparchivo.

El resultado es lo que esperaba:

Tiempo: 31 ms, Memoria: 2,75 Mb

OK (1 prueba, 1 afirmación)

Luego intenté usar un archivo de configuración para cargar automáticamente el conjunto de pruebas en lugar de tener que escribir manualmente el archivo cada vez. Creé un archivo llamado phpunit.xmlen mi directorio raíz e ingresé lo siguiente en el archivo: http://pastebin.com/0j0L4WBD :

<?xml version = "1.0" encoding="UTF-8" ?>
<phpunit>
    <testsuites>
        <testsuite name="Tests">
            <directory>tests</directory>
        </testsuite>
    </testsuites>
</phpunit>

Ahora, cuando ejecuto el comando:

phpunit

Obtengo el siguiente resultado:

PHPUnit 4.5.0 por Sebastian Bergmann y colaboradores.

Configuración leída de /Users/muyiwa/Projects/DatabaseHelper/phpunit.xml

Tiempo: 16 ms, memoria: 1,50 Mb

¡No se han realizado pruebas!

En caso de que sea útil, la estructura de mi directorio es la siguiente:
src - Directorio de nivel superior (con todo mi código fuente)
pruebas - Directorio de nivel superior (con todas mis pruebas, estructurado igual que mi carpeta src )
proveedor - Archivos de terceros de Composer

También tengo el compositor json y el archivo de bloqueo, así como el archivo phpunit xml en el nivel superior como archivos.

Cosas que he probado

  • Cambiar el directorio phpunit.xmlatests/GeneralStringFunctions
  • Cambiar el directorio phpunit.xmla./tests
  • Mover el phpunit.xmlarchivo al testsdirectorio y luego cambiar el directorio para que sea en ./lugar de tests.
  • Agregar un atributo de sufijo a la etiqueta de directorio phpunit.xmlpara especificar "Pruebas" como sufijo explícito.
Muyiwa Olu
fuente
¿Es tests/GeneralStringFunctions/GeneralStringFunctionsTestuna carpeta o un nombre de archivo?
hek2mgl
@ hek2mgl Es un nombre de archivo, en realidad se llama GeneralStringFunctionsTest.php. En la interfaz de línea de comandos, no ingresé la .phpextensión porque funcionaba sin ella.
Muyiwa Olu
1
Bien, entonces tu configuración debería funcionar. Por cierto, si especifica un sufijo, debería ser en Test.phplugar de Testen su caso, pero sin embargo, puede omitirlo, ya que Test.phpes el valor predeterminado.
hek2mgl
@ hek2mgl ¡Gracias por el aviso! ¿Tiene alguna idea de por qué mi prueba no se ejecuta con el archivo de configuración phpunit.xml?
Muyiwa Olu
¿Por qué no nos muestra el archivo de configuración?
Jueves

Respuestas:

191

Por lo que vale (llegar tarde), me encontré con esto recientemente mientras estaba haciendo un nuevo proyecto de Laravel 5.1 para un sitio web simple. Traté de depurarlo y estaba confundido cuando lo intenté:

php artisan make:test homeTest

(que tiene una prueba predeterminada que solo afirma que verdadero es verdadero)

y vi la salida

No tests executed!

Lo que terminó siendo el problema para mí estaba relacionado con mi instalación de PHP: "phpunit" se registró globalmente y se configuró de manera diferente, mientras que el phpunit que vino con la instalación de Laravel se configuró correctamente y funcionó perfectamente.

Entonces, la solución es ejecutar phpunit configurado por el proveedor (desde el mismo directorio raíz que app / y tests /):

./vendor/bin/phpunit

¡Espero que ayude a alguien más!

RoboBear
fuente
4
Creo que esta es probablemente la respuesta correcta. Desde entonces, eliminé el proyecto, por lo que no tengo forma de verificarlo dos veces, pero para proyectos futuros con composer, siempre he usado en vendor/bin/phpunitlugar del phpunitbinario global . Incluso he ido tan lejos como para eliminar el phpunitbinario global para no volver a cometer accidentalmente el mismo error, y no ha aparecido desde entonces. Marcaré esto como la respuesta aceptada, ya que probablemente sea la razón.
Muyiwa Olu
3
llamar ./vendor/bin/phpunitme funcionó en una nueva instalación de laravel 5.4
ira
Del mismo modo, esto me ayudó mientras trabajaba en un proyecto de Wordpress. El mismo problema: "phpunit" se puede registrar y configurar globalmente de manera diferente. ¡Gracias por compartir!
sqsinger
Esto lo solucionó para mí, pero ¿hay alguna manera de arreglar globalmente el phpunit? Sería bueno si pudiera escribirphpunit
Noitidart
2
@Noitidart puede crear un aliaspara ./vendor/bin/phpunit
Ganesh K
98

Su archivo XML está bien como está. Sin embargo, debe asegurarse de que los archivos PHP en sutests/ carpeta tengan el siguiente nombre:

tests / Test.php <--- Tenga en cuenta la "T" mayúscula
tests / usuario Test.php
tests / fooBar Test.php
etc.

Los nombres de archivo deben terminar con "Test.php" . Esto es lo que busca PHPUnit dentro de los directorios.

Además, cada método de prueba debe tener un nombre que comience con "prueba":

public function testFooBar()
{
    // Your test code
}

¡Espero que ayude!

Lionel
fuente
4
o puede utilizar --test-suffix=anything.phppara anular
suma de comprobación
para mí fue útil reemplazar la ruta relativa a la carpeta de prueba con la ruta absoluta.
Timur Samkharadze
¿Cómo anulo esto en el archivo de configuración?
Jonathan
19

En Windows, use el siguiente comando en la terminal

.\vendor\bin\phpunit

eso es si el comando

phpunit

devuelve "¡No se han ejecutado pruebas!"

mientras estás en Mac

./vendor/bin/phpunit

Espero eso ayude.

Ndong Akwo
fuente
Muchas gracias por tu respuesta, esto realmente ayuda.
Goke Obasa
Asegúrese de que no haya ninguna phpuniten su ruta global (puede verificar que se ejecute algo como phpunit --versiony ver si coincide con lo que espera. Xampp generalmente instala un phpunit en el mismo directorio de php bin. Ese fue el problema para mí.
giovannipds
12

Tuve el mismo problema después de que PHPUnit en nuestras máquinas virtuales se actualizara a la versión 6. Incluso --debug y --verbose no dijeron nada útil, solo "No se ejecutaron pruebas". Al final resultó que las clases y los espacios de nombres se cambiaron en la nueva versión y simplemente no quería ejecutar los archivos que contenían referencias a clases antiguas. La solución para mí fue simplemente reemplazar en cada caso de prueba esto:

class MyTestCase extends \PHPUnit_Framework_TestCase {...}

con:

use PHPUnit\Framework\TestCase;

class MyTestCase extends TestCase {...}
igors
fuente
Ah, sí, aunque no parece que esta fuera la respuesta a la pregunta original, ¡resolvió mi problema después de actualizar a 6.x!
Tama
Este fue el problema para mí al actualizar de PHPUnit 5.7 a 8.5 también, ¡gracias por el consejo!
confirmador
7

Me doy cuenta de que esto es muy antiguo, pero también me pasó a mí. Espero que esto ayude a alguien.

Mi problema fue que olvidé el símbolo '@' en / ** @test * /

INCORRECTO:

/** test */
function a_thread_can_be_deleted()
{
    ...
}

CORRECTO:

/** @test */
function a_thread_can_be_deleted()
{
    ...
}
Brad Ahrens
fuente
1
más de 2 años después, y esto fue todo para mí. realmente tiene que ser exactamente ese formato para el comentario. Me faltaba un espacio allí. no lo detectó. lo que es un poco molesto, en laravel 6.1 usé el comando de creación artesanal y no incluye ese comentario
aibarra
1
Esta respuesta es útil
Domingo
Me encontré con el problema cuando estaba desarrollando un paquete. Cuando ejecuto 'php artisan make: test SomeTest' y lo moví al directorio de pruebas del paquete, el comentario del método básico testExample solo contiene una descripción básica @return voidy no contiene '@test', que es la razón por la que phpunit no pudo identificar como prueba.
DAMIEN JIANG
5

Me tiré del pelo durante 10 minutos antes de decidir usar --debug (un buen camino a seguir) para descubrir el simple hecho de que el nombre del archivo no respetaba la convención de nomenclatura , tenía una "s" adicional al final .

incorrecto

CreateAdminTests

Correcto

CreateAdminTest

espero que esta nota pueda ayudar a alguien

chebaby
fuente
Genial, pude ejecutar la prueba después de eso
WindSaber
4

Solo necesita llamarlo desde el archivo del proveedor

vendor\bin\phpunit Aviso \ No /

Hamza Zymawy
fuente
3

En lugar de ejecutar phpunit

utilizar

proveedor \ bin \ phpunit

Arun Ganesan
fuente
2

si está utilizando PHPSTORM, vaya a Configuración y luego vaya a

  • Test Frameworks

    y haga clic en + y elija

  • PHPUnit Local entonces

  • Use Composer Auto Loader luego pegue esto como en la ruta al campo del script

  • C:\{YOUR PROJECT NAME}\vendor\autoload.php

  • haga clic en Aceptar

  • HAPPY TESTING

Tahseen Alaa
fuente
2

Verifique el archivo phpunit.xml , mire dentro de las suites de prueba.

Mi versión de phpunit (2019) busca archivos que terminen (sufijo) * Test.php. Por lo tanto, asegúrese de que todos los archivos de prueba tengan el nombre correcto (por ejemplo, BookTest.php es correcto, BookTests.php no lo es, BookTestCase.php no lo es).

Jan Polzer
fuente
2

Llegó tarde a la fiesta, pero esta información puede ayudar a otros.

Las soluciones anteriores no funcionaron para mí. A partir de Laravel 7.x, de forma predeterminada, PHPUnit solo ejecuta archivos PHP con el sufijo "Test.php". Por ejemplo, si crea una prueba, nombrarla CreateUserno funcionará, mientras que nombrarla CreateUserTestfuncionará.

Para superar la limitación, vaya phpunit.xmly modifique el suffixatributo de los directoryelementos:

...
<testsuite name="Unit">

    <!-- modify suffix -->
    <directory suffix=".php">./tests/Unit</directory>

</testsuite>
<testsuite name="Feature">

    <!-- modify suffix -->
    <directory suffix=".php">./tests/Feature</directory>

</testsuite>
...

Esto le indicará a PHPUnit que ejecute todos los archivos con .phpextensión de directorios. Nota para borrar el caché de la aplicación después de la actualización phpunit.xml:

php artisan config:cache

Puede encontrar información adicional sobre la configuración XML de PHPUnit aquí: https://phpunit.de/manual/6.5/en/appendixes.configuration.html

usuario8555937
fuente
1

¿Ha agregado un conjunto de pruebas a su archivo phpunit.xml?

<phpunit>
    <testsuite name="app1" >
        <directory>./</directory>
    </testsuite>
</phpunit>

Puede agregar varios directorios allí.

Aine
fuente
Hola, lo siento si no lo dejé claro en la pregunta, pero agregué un conjunto de pruebas y el nombre correspondiente al archivo XML. Puede encontrar una copia aquí: pastebin.com/0j0L4WBD .
Muyiwa Olu
Pruebe <directory> ./tests </directory>
Aine
Gracias por la actualización, desafortunadamente sigo teniendo el mismo problema con ./tests que mi directorio. Time: 28 ms, Memory: 1.50Mb No tests executed!
Muyiwa Olu
Desafortunadamente, el mismo problema :( Configuration read from /Users/muyiwa/Projects/Web Development/DatabaseHelper/phpunit.xml Time: 66 ms, Memory: 1.50Mb No tests executed!. Definitivamente funciona cuando lo referencia manualmente, simplemente no le gusta cargar desde el archivo de configuración por alguna razón :(
Muyiwa Olu
Última conjetura. Intente mover el archivo phpunit.xml al directorio tests /. En el archivo, cambie el directorio a <directory> ./ </directory>.
Aine
0

Para mí, el uso de phpunit --debug me mostró qué prueba no estaba ejecutando, por dentro, tenía

$this->visit('/')
         ->see('Laravel');

y creo que debido a que el directorio estaba protegido con autenticación .htaccess, no pudo acceder a la página

La solución para mí fue sacar esta prueba (o probablemente sacar la autenticación .htaccess)

relipse
fuente
0

Esto es muy tarde pero espero que ayude a alguien.

Conseguí que mis pruebas se ejecutaran usando una referencia absoluta. estructura de carpetas [proyecto / tests / test.php]

mi línea de directorio se veía así ./tests/test.php

Codebender
fuente
0

Quizás un poco al margen, pero si estás (como yo) usando Laravel en Vagrant, asegúrate de que estás ejecutando phpunit dentro de la caja vagrant y no en el "lado de Windows". :)

martinetil
fuente
0

Tuve el problema de que no se ejecutaban pruebas, incluso cuando las cosas estaban bien configuradas.

La causa fue que el espacio de nombres no fue el primer comando del archivo, fue después de algunos comentarios de bloque de documentos.

La reversión hizo que phpunit viera las pruebas y se ejecutara correctamente.

pgee70
fuente
0

El mío fue un poco divertido.

Cuando usé, php artisan make:testpuse accidentalmente .php como el ProductRewardPointController.phpque creó ProductRewardPointController.php.phpy phpunit simplemente lo ignoró.

Simplemente elimino el .php adicional y las cosas vuelven a la normalidad

Apit John Ismail
fuente
0

Tuve el mismo problema de No se ejecutaron pruebas. , resuelto manteniendo el mismo nombre de archivo y nombre de clase .

Como si
fuente
0

Si está utilizando IDE como JetBrains PHPStorm , tenga en cuenta también que: en la Run/Debug Configurationsventana, Test scopedebe configurarse directoryy apuntar ese directorio a la testsubicación de su carpeta.

Solo me tomó media hora darme cuenta de que olvidé configurar el directorio. Puede usar global phpunit.pharsiempre que configure el alcance de la prueba y el directorio correctamente, el IDE se encargará de otras cosas por usted.

Zhwt
fuente
0

Los nombres de las funciones en el archivo de prueba deben tener el prefijo testo debe haber un comentario agregado antes de la función

/** @test */

Asegúrese de que no sea

/* @test */

porque eso no funciona. debe haber dos asteriscos después de la barra inclinada, no uno.

Mubashar Abbas
fuente
-2

el uso de la consola cmd resolvió este problema pasando la prueba de ruta completa realizada

No encontré otra manera de hacerlo No funciona de esta manera

Espero que esto haya sido útil para alguien.

mcrsftDev
fuente