2011-08-23 12 views
40

Tengo una clase de caso de prueba PHPUnit (que consta de algunas funciones de prueba). Me gustaría escribir una función oneTimeSetUp() para llamar una vez para todas mis pruebas en la clase (a diferencia de la función estándar setUp() que se llama una vez para cada prueba en la clase). En otras palabras, estoy buscando un PHPUnit equivalente al JUnit @BeforeClass annotation.PHPUnit: ¿Cómo creo una función para llamar una vez para todas mis pruebas?

La misma pregunta con una función oneTimeTearDown().

¿Es posible hacerlo en PHPUnit?

+0

Entiendo completamente la necesidad de hacer esto a veces por el rendimiento. Se recomienda evitar esto si es posible para que no comparta el estado entre las pruebas. –

+2

@Greg: estoy de acuerdo. Aún así, hay situaciones en las que es mejor inicializar una vez para todas las pruebas (para establecer una conexión con el DB, por ejemplo). – snakile

+0

Intento evitar la necesidad de un servidor de base de datos burlando el adaptador Zend_Db/PDO en mi mapeador de datos, luego ejecuto las afirmaciones en el SQL que producen mis clases. Agradezco a veces que sea inevitable para las pruebas funcionales/de extremo a extremo. –

Respuesta

59

Eche un vistazo a setUpBeforeClass() desde section 6 de la documentación de PHPUnit.

Para el desgarro de una sola vez debe usar tearDownAfterClass();.

Ambos métodos deben definirse en su clase como métodos estáticos.

+2

Estaba a punto de escribir lo mismo ...Su respuesta es LA respuesta – Fabio

+5

¿Existe alguna alternativa no estática? – Martijn

+0

@Martijn desafortunadamente ahora mismo no hay un método para eso en phpunit. Afortunadamente puede anular esta característica que falta mediante el uso de una bandera "inicializada" o carga lenta en setUp(). Todavía se ejecuta antes de cada prueba, pero no hace nada si la clase de prueba ya se ha inicializado. –

3

Vine a esta página con la misma pregunta, sin embargo, la respuesta aceptada se ejecuta en todas las clases, y para mí no fue la respuesta correcta.

Si es como yo, su primera "prueba de integración" es borrar la base de datos y ejecutar las migraciones. Esto te lleva a una línea base de base de datos para todas las pruebas. En este momento estoy cambiando constantemente los archivos de migración, por lo que establecer la línea base es realmente parte de todas las pruebas.

La migración lleva un tiempo, por lo que no quiero que se ejecute en todas las pruebas.

Luego tuve que construir la base de datos probando cada pieza. Necesito escribir una prueba de pedido, pero primero necesito crear algunos productos y probar eso, luego tengo que probar una función de importación.

Por lo tanto, lo que hice es SUPER fácil, pero no muy bien explicado en Internet. Creé una prueba simple para configurar la base de datos. A continuación, en el archivo de phpspec.xml añadir un banco de pruebas ....

<testsuite name="Products"> 
    <file>tests/in/SystemSetupTest.php</file> 
    <file>tests/in/ProductTest.php</file> 
    <file>tests/in/ProductImportTest.php</file> 
</testsuite> 

Y en el del SystemSetupTest.php ....

class SystemSetupTest extends ApiTester 
{ 

    /** @test */ 
    function system_init() 
    { 
     fwrite(STDOUT, __METHOD__ . "\n"); 
     self::createEM(); //this has all the code to init the system... 
    } 
} 

luego ejecutarlo como:

PHPUnit - -testsuite Productos

Al final, es mucho más fácil. Me permitirá construir mi sistema correctamente.

Además estoy usando laravel 5. Al usar setUpBeforeClass() termino con problemas de arranque, que estoy seguro de que puedo arreglar, pero el método que uso arriba funciona perfecto.

+0

Mejor que eso, ejecute las pruebas de la siguiente manera: './artisan migrate --datebase CONNECTION_NAME &&./Vendor/bin/phpunit'. No es gran cosa si usas el historial de comandos de tu shell. –

Cuestiones relacionadas