Come creare test di integrazione gratuiti scalabili ed effetti collaterali?
https://softwareengineering.stackexchange.com/questions/115455
-
03-11-2019 - |
Domanda
Nel mio progetto attuale, sto facendo fatica 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: si tratta principalmente del database; Non dovrebbero esserci cambiamenti nel database dopo il completamento dei test (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, se applicati a tutti i test di integrazione, ci vogliono circa 5 secondi per testare solo una piccola parte del sistema. Posso immaginare che questo numero aumenti quando la copertura è aumentata.
Quale sarebbe un altro approccio per scrivere tali test? Un'alternativa a cui riesco a pensare è avere una specie di variabili globali (all'interno di una classe) e tutti i metodi di prova condividono questa variabile. Di conseguenza, solo pochi ordini vengono creati ed eliminati; risultando in test più veloci. Tuttavia, penso che questo introdica un problema più grande; I test non sono più isolati e diventano sempre più difficili da capire e analizzarli.
Potrebbe essere solo che i test di integrazione non siano pensati per essere eseguiti tutte le volte come i test unitari; Pertanto le basse prestazioni potrebbero essere accettabili per quelli. In ogni caso, sarebbe bello sapere se qualcuno ha trovato alternative per migliorare la scalabilità.
Nessuna soluzione corretta