In meinem aktuellen Projekt fällt es mir schwer, eine gute Lösung zu finden, um skalierbare Integrationstests zu erstellen, die keine Nebenwirkungen haben. Ein wenig Klarheit über die nebenwirkungsfreie Eigenschaft: Es geht hauptsächlich um die Datenbank; Nach Abschluss der Tests sollten keine Änderungen in der Datenbank vorgenommen werden (der Status sollte beibehalten werden). Vielleicht passen Skalierbarkeit und Zustandserhaltung nicht zusammen, aber ich möchte unbedingt eine bessere Lösung anstreben.
Hier ist ein typischer Integrationstest (diese Tests betreffen die Datenbankebene):
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();
}
}
Wie man sich vorstellen kann, führt dieser Ansatz zu extrem langsamen Tests. Bei den gesamten Integrationstests dauert es ungefähr 5 Sekunden, um nur einen kleinen Teil des Systems zu testen. Ich kann mir vorstellen, dass diese Zahl steigt, wenn die Abdeckung erhöht wird.
Was wäre ein anderer Ansatz, um solche Tests zu schreiben? Eine Alternative, die ich mir vorstellen kann, besteht darin, globale Variablen (innerhalb einer Klasse) zu haben, und alle Testmethoden verwenden diese Variable gemeinsam. Infolgedessen werden nur wenige Aufträge erstellt und gelöscht. was zu schnelleren Tests führt. Ich denke jedoch, dass dies ein größeres Problem mit sich bringt; Die Tests sind nicht mehr isoliert und es wird immer schwieriger, sie zu verstehen und zu analysieren.
Es kann sein, dass Integrationstests nicht so oft ausgeführt werden sollen wie Unit-Tests. daher könnte eine geringe Leistung für diese akzeptabel sein. In jedem Fall wäre es gut zu wissen, ob jemand Alternativen zur Verbesserung der Skalierbarkeit gefunden hat.