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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
scroll top