Al ejecutar una prueba PHPUnit, me gustaría poder volcar la salida para poder depurar una o dos cosas.
He intentado lo siguiente (similar al ejemplo del Manual PHPUnit );
class theTest extends PHPUnit_Framework_TestCase
{
/**
* @outputBuffering disabled
*/
public function testOutput() {
print_r("Hello World");
print "Ping";
echo "Pong";
$out = "Foo";
var_dump($out);
}
}
Con el siguiente resultado:
PHPUnit @package_version@ by Sebastian Bergmann.
.
Time: 0 seconds, Memory: 3.00Mb
OK (1 test, 0 assertions)
Observe que no hay ninguno de los resultados esperados.
Estoy usando las versiones HEAD de los repositorios git a partir del 19 de septiembre de 2011.
Salida de php -version
:
$ php -version
PHP 5.2.9 (cli) (built: Dec 8 2010 11:36:37)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies
with Xdebug v2.1.0, Copyright (c) 2002-2010, by Derick Rethans
¿Hay algo que estoy haciendo mal o es potencialmente un error de PHPUnit?
php
unit-testing
phpunit
Jess Telford
fuente
fuente
testOutput()
método?phpunit /path/to/tests/theTest.php
(si la clase anterior estaba en el archivotheTest.php
).ob_get_level()
regresa1
. Sin embargo, esto se contradice con el siguiente código: conwhile (ob_get_level() > 0) { ob_end_flush(); }
qué erroresob_end_clean(): failed to delete buffer. No buffer to delete.
. Más curioso y más curioso.Respuestas:
ACTUALIZAR
Acabo de darme cuenta de otra forma de hacer esto que funciona mucho mejor que la
--verbose
opción de línea de comando:Esto le permite volcar cualquier cosa a su consola en cualquier momento sin toda la salida no deseada que viene junto con la
--verbose
opción CLI.Como han señalado otras respuestas, es mejor probar la salida utilizando los métodos integrados como:
Sin embargo, a veces es útil ser travieso y ver resultados de depuración únicos / temporales desde sus casos de prueba. Sin
var_dump
embargo, no es necesario el hack / solución. Esto se puede lograr fácilmente configurando la--verbose
opción de línea de comando al ejecutar su conjunto de pruebas. Por ejemplo:Esto mostrará resultados desde dentro de sus métodos de prueba cuando se ejecute en el entorno CLI.
Ver: Escritura de pruebas para PHPUnit - Prueba de salida .
fuente
file_put_contents('php://stderr', $myDebugVar, FILE_APPEND);
, porque tenía un mensajeUse of undefined constant STDERR - assumed 'STDERR'
con fwrite .STDOUT
lugar deSTERR
STDERR
. Estoy usandoPHPUnit 4.5.0
en la línea de cmd de windows. Unaecho
declaración no da los mismos resultados.echo
genera salida pero solo después de que se muestra el resultado de la prueba.fwrite(STDERR, 'string')
ofwrite(STDOUT,'string')
producir los mismos resultados: una salida antes de que se muestre el resultado de la prueba.Actualización: consulte la actualización de rdlowrey a continuación sobre el uso de
fwrite(STDERR, print_r($myDebugVar, TRUE));
una solución mucho más simpleEste comportamiento es intencional (como ha señalado jasonbar ). El estado conflictivo del manual ha sido reportado a PHPUnit.
Una solución alternativa es hacer que PHPUnit afirme que la salida esperada está vacía (cuando, de hecho, hay salida), lo que provocará que se muestre la salida inesperada.
da:
Asegúrese de deshabilitar cualquier otra aserción que tenga para la prueba, ya que pueden fallar antes de que se pruebe la aserción de salida (y, por lo tanto, no verá la salida).
fuente
Intenta usar
--debug
Es útil si está intentando obtener la ruta correcta para un archivo de datos de inclusión o fuente.
fuente
No es un error, pero es muy intencional. Su mejor opción es escribir en un archivo de registro de algún tipo y seguir el registro para observar la salida.
Si está intentando PROBAR salida, verifique esto .
También:
fuente
Estoy teniendo suerte con VisualPHPUnit , y muestra útilmente la salida, entre otras cosas.
fuente
Realmente debería pensar en sus intenciones: si necesita la información ahora al depurar para corregir la prueba, la necesitará la próxima semana nuevamente cuando se rompan las pruebas.
Esto significa que usted va a necesitar la información siempre cuando la prueba falla - y añadiendo una
var_dump
para encontrar la causa es demasiado trabajo. Más bien ponga los datos en sus afirmaciones.Si su código es demasiado complejo para eso, divídalo hasta llegar a un nivel en el que una afirmación (con un mensaje personalizado) le diga lo suficiente como para saber dónde se rompió, por qué y cómo solucionar el código.
fuente
En laravel 5 puede usar dump (), volcar el contenido de la última respuesta.
da
fuente
Simplemente use la bandera --verbose cuando ejecute phpunit .
La ventaja de este método es que no necesita cambiar el código de prueba, puede imprimir cadenas, var_dump o cualquier cosa que desee siempre y se mostrará en la consola solo cuando esté configurado el modo detallado .
Espero que esto ayude.
fuente
En algunos casos, se podría usar algo así para enviar algo a la consola
fuente
Hackish, pero funciona: produce una excepción con la salida de depuración como mensaje.
Rendimientos:
fuente
Esto fue tomado de PHPUnit Docs sobre Fixtures .
Esto debería permitirle volcar información en cualquier momento durante el ciclo de vida de la prueba phpunit.
Simplemente reemplace
__METHOD__
en el código a continuación con lo que quiera generarEjemplo 4.2: Ejemplo que muestra todos los métodos de plantilla disponibles
fuente
Emití mis Testresults basados en HTML, en este caso fue útil para vaciar el contenido:
Hay un segundo método PHP
que no lo he intentado
fuente
PHPUnit está ocultando la salida con
ob_start()
. Podemos deshabilitarlo temporalmente.fuente
Tuve que modificar el código fuente para que este código funcione, por lo que debe agregar la URL de estos repositorios bifurcados al compositor para que esto funcione
fuente
Aquí hay algunos métodos útiles para imprimir mensajes de depuración en PHPUnit 4.x:
syslog(LOG_DEBUG, "Debug: Message 1!");
Más ejemplo práctico:
Las llamadas
syslog()
generarán un mensaje de registro del sistema (ver:)man syslog.conf
.Nota: Los niveles posibles:
LOG_DEBUG
,LOG_INFO
,LOG_NOTICE
,LOG_WARNING
,LOG_ERR
, etc.En macOS, para transmitir los mensajes de syslog en tiempo real, ejecute:
fwrite(STDERR, "LOG: Message 2!\n");
Nota: La
STDERR
constante no está disponible si lee el script PHP desde stdin . Aquí está la solución .Nota: en lugar de
STDERR
, también puede especificar un nombre de archivo.file_put_contents('php://stderr', "LOG: Message 3!\n", FILE_APPEND);
Nota: Use este método, si no tiene una
STDERR
constante definida.register_shutdown_function('file_put_contents', 'php://stderr', "LOG: Message 4!\n", FILE_APPEND);
Nota: Use este método si desea imprimir algo al final sin afectar las pruebas.
Para volcar la variable, use
var_export()
, por ej."Value: " . var_export($some_var, TRUE) . "\n"
.Para imprimir los mensajes anteriores solo durante el modo detallado o de depuración, vea: ¿Hay alguna manera de saber si --debug o --verbose se pasó a PHPUnit en una prueba?
Aunque si la prueba de la salida es parte de la prueba en sí misma, consulte: Página Prueba de documentos de salida .
fuente
Si usa Laravel, puede usar funciones de registro como info () para iniciar sesión en el archivo de registro de Laravel en almacenamiento / registros. Por lo tanto, no aparecerá en su terminal sino en el archivo de registro.
fuente