En mi proyecto actual, me cuesta mucho 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 debe haber ningún cambio en la base de datos después de que se completen las pruebas (se debe conservar el estado). Tal vez la escalabilidad y la conservación del estado no se unan, pero realmente quiero buscar 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 parte del sistema. Puedo imaginar que este número aumenta cuando se aumenta 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 & eliminado resultando en pruebas más rápidas. Sin embargo, creo que esto introduce un problema mayor; las pruebas ya no están aisladas y cada vez son más difíciles de entender & analizarlos.
Puede ser que las pruebas de integración no estén destinadas a ejecutarse tan a menudo como las pruebas unitarias; por lo tanto, un bajo rendimiento podría ser aceptable para aquellos. En cualquier caso, sería bueno saber si a alguien se le ocurrieron alternativas para mejorar la escalabilidad.