2012-04-20 8 views
21

Actualmente tengo un problema que tengo que solucionar en el código heredado para que nuestra interacción con una extensión PHP funcione correctamente (Singleton Testing Question).Cómo determinar si las pruebas PHPUnit se están ejecutando?

Como tal, no quiero ejecutar este código cuando ejecute nuestro código de producción normal con la aplicación. Por lo tanto, necesito verificar el código PHP normal si el código que se está ejecutando se está ejecutando como parte de una prueba o no.

¿Alguna sugerencia sobre cómo determinar esto? Pensé en una variable definida vinculada a la presencia de los archivos de prueba (no enviamos las pruebas a los clientes), pero nuestros desarrolladores necesitan que la extensión funcione normalmente, mientras que el servidor de CI necesita ejecutar las pruebas.

¿Se recomienda un conjunto global en el archivo PHPUnit.xml? ¿Otros pensamientos?

Respuesta

23

Defina una constante en su archivo PHPUnit bootstrap.php. Esto se ejecuta antes de cargar o ejecutar cualquier prueba. Esto no debería afectar a los desarrolladores que ejecutan la aplicación normalmente, solo las pruebas unitarias.

+0

Gracias. Eso funciona como un encanto, y todavía puedo detectar mi entorno de desarrollo para otros procesos de código. –

+0

Perfecto, funcionó muy bien aquí. Muchas gracias. – GoinAum

29

Un enfoque alternativo es set a constant in the PHP section of your phpunit.xml.*:

<php> 
    <const name="PHPUNIT_YOURAPPLICATION_TESTSUITE" value="true"/> 
</php> 

En su aplicación PHP, es posible que a continuación, utilizar la siguiente comprobación:

if (defined('PHPUNIT_YOURAPPLICATION_TESTSUITE') && PHPUNIT_YOURAPPLICATION_TESTSUITE) 
{ 
    echo 'TestSuite running!'; 
} 
+0

Tenga en cuenta que PHP evalúa de manera extraña una constante indefinida como una cadena (si 'EJEMPLO 'no está definido, se evalúa como'' EJEMPLO''. Es decir, debe evaluarlo adecuadamente con '==='. aún arrojar una notificación sobre una constante indefinida. –

+2

No '===' también coincidirá con el tipo arriba, y ya que se define como 'true' (a boolean) pero está comprobando si es' 1' (un entero) , no funcionará, entiendo tu comentario, pero en este ejemplo, '==' es mejor. –

+3

Gracias a tu respuesta encontré que (en 'Laravel 5')' APP_ENV' está configurado como 'testing'. Esto hizo es realmente fácil implementar tu respuesta. Realmente recomendaría esta solución para Laravel. –

10

se puede comprobar las maneras diferentes.

if(PHP_SAPI == 'cli') { 

    if(strpos($_SERVER['argv'][0], 'phpunit') !== FALSE) { ... } 
    // or 
    if($_SERVER['argv'][0] == '/usr/bin/phpunit') { ... } 

} 
+2

$ _SERVER ['argv'] [0] en lugar de $ argv [0] –

1

Uso laravel log file para determinar si las pruebas de PHPUnit se están ejecutando.

+5

En Laravel el phpunit.xml establece 'APP_ENV' en' Probando. ¿Tal vez es más fácil para usted que el archivo de registro? (solo una sugerencia) –

+0

Gracias, es bueno saberlo. –

Cuestiones relacionadas