Nel mio progetto attuale, ho difficoltà a trovare una buona soluzione per creare test di integrazione scalabili che non hanno effetti collaterali. Un piccolo chiarimento sulla proprietà libera dell'effetto collaterale: riguarda principalmente il database; non ci dovrebbero essere cambiamenti nel database dopo che i test sono stati completati (lo stato dovrebbe essere preservato). Forse la scalabilità e la conservazione dello stato non si uniscono, ma voglio davvero spingere per una soluzione migliore.
Ecco un tipico test di integrazione (questi test toccano il livello del database):
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();
}
}
Come si potrebbe immaginare, questo approccio produce test estremamente lenti. E, quando applicato a tutti i test di integrazione, sono necessari circa 5 secondi per testare solo una piccola parte del sistema. Posso immaginare che questo numero aumenti quando aumenta la copertura.
Quale sarebbe un altro approccio per scrivere tali test? Un'alternativa a cui riesco a pensare è avere una sorta di variabili globali (all'interno di una classe) e tutti i metodi di test condividono questa variabile. Di conseguenza, solo pochi ordini vengono creati ed eliminati; con conseguente test più veloci. Tuttavia, penso che questo introduca un problema più grande; i test non sono più isolati e diventa sempre più difficile comprenderli e analizzarli.
È possibile che i test di integrazione non vengano eseguiti con la stessa frequenza dei test unitari; quindi le prestazioni basse potrebbero essere accettabili per quelli. In ogni caso, sarebbe bello sapere se qualcuno ha trovato alternative per migliorare la scalabilità.