En mi proyecto actual, estoy teniendo dificultades para encontrar una buena solución para crear pruebas de integración escalables que no tengan efectos secundarios. Una pequeña aclaración sobre la propiedad libre de efectos secundarios: se trata principalmente de la base de datos; no debería haber ningún cambio en la base de datos después de que se completen las pruebas (el estado debe conservarse). Tal vez la escalabilidad y la preservación del estado no se unen, pero realmente quiero impulsar una mejor solución.
Aquí hay una prueba de integración típica (estas pruebas tocan la capa de la base de datos):
public class OrderTests {
List<Order> ordersToDelete = new ArrayList<Order>();
public testOrderCreation() {
Order order = new Order();
assertTrue(order.save());
orderToDelete.add(order);
}
public testOrderComparison() {
Order order = new Order();
Order order2 = new Order();
assertFalse(order.isEqual(order2);
orderToDelete.add(order);
orderToDelete.add(order2);
}
// More tests
public teardown() {
for(Order order : ordersToDelete)
order.delete();
}
}
Como uno podría imaginar, este enfoque produce pruebas que son extremadamente lentas. Y, cuando se aplica a todas las pruebas de integración, toma alrededor de 5 segundos probar solo una pequeña porción del sistema. Me imagino que este número aumentará cuando aumente la cobertura.
¿Cuál sería otro enfoque para escribir tales pruebas?Una alternativa que se me ocurre es tener un tipo de variables globales (dentro de una clase) y todos los métodos de prueba comparten esta variable. Como resultado, solo unos pocos pedidos se crean y eliminan; resultando en pruebas más rápidas. Sin embargo, creo que esto presenta un problema mayor; las pruebas ya no están aisladas y se hace cada vez más difícil de entender y analizar.
Puede ser que las pruebas de integración no estén destinadas a ejecutarse con tanta frecuencia como las pruebas unitarias; por lo tanto, el bajo rendimiento podría ser aceptable para aquellos. En cualquier caso, sería genial saber si a alguien se le ocurrieron alternativas para mejorar la escalabilidad.