php - unitarias - testing in laravel




¿Qué hace el modo PHPUnit Strict? (2)

Tenga en cuenta que PHPUnit traga todo el resultado que se emite durante la ejecución de una prueba. En modo estricto, una prueba que emite salida fallará.

Eso es todo lo que pude encontrar en la documentación, pero también revisé las fuentes y encontré eso en modo estricto:

  1. Las pruebas sin aserciones pueden marcarse como incompletas / fallidas.
  2. Cada prueba puede ejecutarse con un límite de tiempo de ejecución según su tamaño y la presencia de la extensión pcntl y la biblioteca PHP_Invoker . Hay tres valores de tiempos de espera:

    • timeoutForSmallTests (valor predeterminado: 1)
    • timeoutForMediumTests (valor predeterminado: 10)
    • timeoutForLargeTests (valor predeterminado: 60)

    El tamaño de prueba (pequeño, mediano o grande) está determinado por el PHPUnit_Util_Test::getSize() :

    • Los casos de prueba que descienden de PHPUnit_Extensions_Database_TestCase o PHPUnit_Extensions_SeleniumTestCase son grandes.
    • Los casos de prueba y las pruebas individuales también pueden hacerse grandes o medios agregándolos a los groups 'grande' o 'medum', respectivamente.
    • De lo contrario, la prueba es pequeña.

Parece que el modo estricto solo cambia los tres anteriores, pero no estoy absolutamente seguro de eso. Nunca estudié las fuentes de PHPUnit antes, ni usé el modo estricto.

Me pregunto qué es el "modo estricto en PHPUnit".

p.ej:

phpunit --strict

o en phpunit.xml

<phpunit strict="true">

Lo encendí solo para probarlo y mis pruebas comenzaron a fallar con

PHP_Invoker_TimeoutException: Execution aborted after 1 second

Respuesta corta: para las pruebas de larga ejecución, use una anotación para aumentar el tiempo de ejecución permitido:

@large // 10 seconds
@medium // 5 seconds
@small // 1 second max <-- Default, so no point using

Respuesta larga:

Aquí hay un conjunto actualizado de información que se obtuvo con la ayuda de @Crozin.

En mi caso, el error fue que una prueba tardaba demasiado (> 1 segundo) (Doctrine ORM schema drop + create puede ralentizar las cosas, vea este ZendCast por lo que estaba haciendo ). Esto estaba causando un problema (y algunos resultados) de PHP_Invoker. El modo estricto no permite ninguna salida.

Al leer / Ingeniería inversa /usr/share/php/pear/share/pear/PHPUnit/Util/Test.php::getSize () (y getGroups () en la misma clase) ... descubrí que hay 3 anotaciones no documentadas nosotros podemos usar:

@large  // 10 seconds
@medium // 5 seconds
@small // 1 second max run time

Se pueden especificar en el nivel de clase o en el nivel de método. El Issue # 490 en PHPUnit github alude a problemas con el suministro tanto de nivel de clase como de nivel de método así que YMMV si los mezclas. Como dijo crozin, los tiempos muertos asignados son de 10,5,1 segundos, respectivamente.

Una solución alternativa era aumentar el tiempo que una función invocada puede ejecutarse (en mi computadora lenta).

sudo vi /usr/share/php/pear/share/pear/PHP/Invoker.php

Increase line 1 "declare(ticks = 1);" to
    "declare(ticks = 10);" // or any higher int that meets your needs 

Aquí hay un montón de información sobre el modo estricto que me ayudó a encontrar la solución:

PHP_Invoker
Una clase de utilidad para invocar callables con un tiempo de espera excedido. Se requiere este paquete para exigir tiempos de espera de prueba en modo estricto. [ Instrucciones de instalación de PHPUnit ]

Las pruebas de modo estricto que no afirman nada están marcadas como incompletas. Las pruebas que están incompletas (omitidas) no dan cobertura de código. Slideshare de Sebastian Bergmann (diapositiva 10)

Nota
Tenga en cuenta que PHPUnit traga todo el resultado que se emite durante la ejecución de una prueba. En modo estricto, una prueba que emite salida fallará. Prueba de la sección de salida de PHPUnit Manual





phpunit