sábado, 24 de enero de 2015

Aprende acelerar la ejecución de tus tests con PHPUnit

Para que una suite de tests unitarios y funcionales sea útil, debe ser muy rápida al ejecutarse. Si desarrollas tus aplicaciones siguiendo metodologías como el TDD o desarrollo guiado por pruebas, entonces la rapidez no es recomendable sino totalmente obligatoria.
Algunos autores sugieren que todos los tests de la aplicación deberían ejecutarse en 10 segundos o menos. Por eso en este artículo te explicamos varias técnicas para acelerar la ejecución de tus tests con PHPUnit.

Recomendaciones básicas

1. No crees más fixtures de los que necesitas. ¿Para qué insertas 10.000 registros con datos de prueba en la base de datos si a tus tests les basta con tener 20 registros? Genera siempre el mínimo número posible de datos de prueba.
2. No regeneres la base de datos de prueba para cada test. Aunque en tus tests utilices bases de datos SQLite en memoria, regenerarlas para cada test es un proceso muy costoso en suites con miles de tests.
La solución consiste en generar una única base de datos SQLite al comienzo de todos los test y llenarla con todos los datos de prueba. Después, antes de cada test haces una copia de ese archivo para tener una base de datos completamente nueva. Esta técnica es tan habitual entre programadores, que si utilizas Symfony existe un bundle llamado LiipFunctionalTestBundle que lo hace por ti automáticamente.
3. No abuses de los métodos setUp() y tearDown(). Estos métodos te permiten ejecutar código antes y después de cada test, por lo que son ideales para inicializar objetos y eliminar cualquier elemento generado por los tests.
El problema es que estos métodos se ejecutan, respectivamente, antes y después de cada test de cada clase, por lo que pueden ralentizar mucho su ejecución. Por eso PHPUnit define también los métodos setUpBeforeClass() y tearDownAfterClass(), que solamente se ejecutan, respectivamente, antes del primer test de la clase y después del último test. Si has diseñado bien tus clases de test, seguramente podrás reemplazar setUp() y tearDown() por estos otros métodos.
4. No abuses del dataProvider. Esta característica de PHPUnit te permite ejecutar repetidamente un mismo test utilizando diferentes datos de entrada cada vez. Como resulta tan sencillo añadir nuevos datos de prueba, algunos programadores abusan del dataProvider añadiendo decenas de datos de entrada para aumentar así el número total de asserts y parecer que has hecho muchos tests.
En realidad tus tests sólo deberían probar los (pocos) casos esperados por tu código y los (pocos) casos límites que podrían romper tu código. Imagina que quieres testear un método que incrementa elstock de un producto en unidades enteras positivas. Los casos a probar podrían ser solamente los siguientes:
/**
 * @dataProvider provideIncrementosDeStock
 */
public testIncrementaStock($unidades)
{
    // ...
}
 
public function provideIncrementosDeStock()
{
    return [
        // estos son los casos esperados (números enteros positivos)
        [1], [5],
        // estos son los casos límite (ceros, negativos, decimales, letras)
        [-3], [2.3], [0], [null], ['a']
    ];
}



Fuente:enlace

Si quieres seguir aprendiendo con nosotros, puedes ingresar a nuestros 

Cursos y Diplomados de Tecnología Web visita www.uneweb.edu.ve  para más información

No hay comentarios:

Publicar un comentario

Entradas populares