PHPUnit: ‘No se ejecutaron pruebas’ al usar el archivo de configuración

4 minutos de lectura

El problema

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

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 ejecutaba comandos como:

$ phpunit tests/GeneralStringFunctions/GeneralStringFunctionsTest

Tenga en cuenta que este es un comando de terminal, por lo que no incluí el .php extensión. La prueba GeneralStringFunctions a la que se hace referencia anteriormente es en realidad una GeneralStringFunctionsTest.php expediente.

El resultado es lo que esperaba:

Tiempo: 31 ms, Memoria: 2,75 Mb

OK (1 prueba, 1 afirmación)

Luego traté de 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.xml en 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

¡Ninguna prueba ejecutada!

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)
tests – Directorio de nivel superior (con todas mis pruebas, estructurado igual que mi origen carpeta)
proveedor: archivos de terceros de Composer

También tengo el archivo composer json y lock, así como el archivo phpunit xml en el nivel superior como archivos.

Cosas que he probado

  • Cambiando el directorio en phpunit.xml a tests/GeneralStringFunctions
  • Cambiando el directorio en phpunit.xml a ./tests
  • moviendo el phpunit.xml archivo a la tests directorio y luego cambiar el directorio para que sea ./ en vez de tests.
  • Agregar un atributo de sufijo a la etiqueta de directorio en phpunit.xml para especificar “Pruebas” como el sufijo explícito.

  • Es tests/GeneralStringFunctions/GeneralStringFunctionsTest una carpeta o un nombre de archivo?

    – hek2mgl

    27 de marzo de 2015 a las 11:21

  • @hek2mgl Es un nombre de archivo, en realidad se llama GeneralStringFunctionsTest.php. En la interfaz de línea de comandos, no ingresé el .php extensión porque funcionaba sin ella.

    usuario4165455

    27 de marzo de 2015 a las 11:32

  • Bien, entonces su configuración debería funcionar. Por cierto, si especifica un sufijo, debería ser Test.php más bien que Test en su caso, pero sin embargo, es libre de omitir eso ya que Test.php es el valor predeterminado.

    – hek2mgl

    27 de marzo de 2015 a las 11:35


  • @hek2mgl ¡Gracias por avisar! ¿Tiene alguna idea de por qué mi prueba no se ejecuta con el archivo de configuración? phpunit.xml?

    usuario4165455

    27/03/2015 a las 11:40

  • ¿Por qué no nos muestras el archivo de configuración?

    – ThW

    27 de marzo de 2015 a las 13:41

Por lo que vale (llegar tarde), me encontré con esto recientemente mientras estaba haciendo un nuevo proyecto 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 simplemente afirma que verdadero es verdadero)

y vi la salida

No tests executed!

El problema terminó siendo para mí 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 la phpunit configurada por el proveedor (desde el mismo directorio raíz que app/ y tests/):

./vendor/bin/phpunit

¡Espero que eso ayude a alguien más!

  • 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 vendor/bin/phpunit en lugar del mundial phpunit binario. Incluso he ido tan lejos como para eliminar el global phpunit binary para no volver a cometer el mismo error accidentalmente, y no ha aparecido desde entonces. Marcaré esto como la respuesta aceptada, ya que lo más probable es que sea la razón.

    usuario4165455

    17 de febrero de 2017 a las 11:32

  • vocación ./vendor/bin/phpunit hizo el truco para mí en una nueva instalación de laravel 5.4

    – ir

    28 de abril de 2017 a las 14:18

  • Del mismo modo, esto me ayudó mientras trabajaba en un proyecto de WordPress. El mismo problema: “phpunit” puede registrarse globalmente y configurarse de manera diferente. ¡Gracias por compartir!

    – cantante

    16 de julio de 2017 a las 7:10

  • @Noitidart puedes crear un alias por ./vendor/bin/phpunit

    – Ganesh K.

    23 de octubre de 2017 a las 4:15

  • usando vendor\bin\phpunit (en Windows) funcionó para mí!

    – Liga

    6 de enero de 2020 a las 6:17

avatar de usuario
leonel

Su archivo XML está bien tal como está. Sin embargo, debe asegurarse de que los archivos PHP en su tests/ carpeta se nombran de la siguiente manera:

pruebas/Prueba.php pruebas/usuarioPrueba.php

pruebas/fooBarPrueba.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” O una @test anotación:

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

o:

 /**
  * @test
  */
 public function fooBarTest() {
     // test code here
 }

¡Espero que ayude!

  • o puedes usar --test-suffix=anything.php para anular

    – suma de comprobación

    12/06/2016 a las 14:40

  • para mí fue útil reemplazar la ruta relativa a la carpeta de prueba con una ruta absoluta.

    – Timur Samkharadze

    5 oct 2017 a las 12:30

  • ¿Cómo anulo esto en el archivo de configuración?

    – Jonathan

    15 de marzo de 2019 a las 3:03

  • ¿Por qué recordar la magia del sufijo cuando solo puede nombrar el archivo AcceptanceXYZTest.php? De esta manera, todos sabrán instantáneamente que es una prueba. Puedes ofc. sea ​​súper único y llámelo XYZTestCaseFile.php y use un sufijo, pero ¿dónde está la ganancia neta aquí?

    – mecanismo de relojería

    13 abr a las 9:09


  • Agregar prueba a los métodos lo arregló, gracias

    – Alkari

    2 de mayo a las 8:46

avatar de usuario
Ndong Akwo

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á en Mac

./vendor/bin/phpunit

Espero eso ayude.

  • Muchas gracias por tu respuesta, esto realmente ayuda.

    – Goke Obasa

    18 de abril de 2018 a las 1:03

  • Asegúrate de que no haya phpunit en su ruta global (puede verificarlo ejecutando algo como phpunit --version y ver si coincide con lo que estás esperando. Xampp generalmente instala una unidad de php en el mismo directorio de bin de php. Ese fue el problema para mí.

    – giovannips

    11 de diciembre de 2019 a las 18:22

  • Soy una de las personas más ignorantes del mundo en lo que respecta a las pruebas unitarias, por lo que sería bueno el motivo de esto, pero realmente ayudó. ¡Gracias de cualquier manera!

    – Mi proyecto de codificación

    1 de enero de 2021 a las 12:33

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

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

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

EQUIVOCADO:

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

CORRECTO:

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

  • 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 detecto. lo que es un poco molesto, en laravel 6.1 usé el comando craft y no incluye ese comentario

    – aibarra

    10 oct 2019 a las 15:14

  • esta respuesta es util

    – Domingo

    10 mayo 2020 a las 11:45

  • Me encontré con el problema cuando estaba desarrollando un paquete. Cuando ejecuto ‘php crafted make:test SomeTest’ y lo muevo al directorio de pruebas del paquete, el comentario del método testExample básico solo contiene una descripción básica y @return void y no contiene ‘@test’, razón por la cual phpunit no pudo identificarlo como una prueba.

    – DAMIEN JIANG

    21 de agosto de 2020 a las 0:20

avatar de usuario
gordito

Tiré de mi cabello durante 10 minutos antes de decidir usar –depurar (buen camino por cierto) para descubrir el simple hecho de que el nombre del archivo no respetar la convención de nomenclaturatenía una “s” extra al final.

equivocado

CreateAdminTests

Correcto

CreateAdminTest

espero que esta nota pueda ayudar a alguien

  • 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 detecto. lo que es un poco molesto, en laravel 6.1 usé el comando craft y no incluye ese comentario

    – aibarra

    10 oct 2019 a las 15:14

  • esta respuesta es util

    – Domingo

    10 mayo 2020 a las 11:45

  • Me encontré con el problema cuando estaba desarrollando un paquete. Cuando ejecuto ‘php crafted make:test SomeTest’ y lo muevo al directorio de pruebas del paquete, el comentario del método testExample básico solo contiene una descripción básica y @return void y no contiene ‘@test’, razón por la cual phpunit no pudo identificarlo como una prueba.

    – DAMIEN JIANG

    21 de agosto de 2020 a las 0:20

avatar de usuario
usuario8555937

Llegué 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 ejecuta solo archivos PHP con el sufijo “Test.php”. Por ejemplo, si crea una prueba, nombrándola CreateUser no funcionará, mientras que nombrarlo CreateUserTest trabajará.

Para superar la limitación, vaya a phpunit.xml y modificar suffix atributo de directory elementos:

...
<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 .php extensión de directorios. Nota para borrar el caché de la aplicación después de actualizar 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

¿Ha sido útil esta solución?