Dans mon projet actuel, j'ai du mal à trouver une bonne solution pour créer des tests d'intégration évolutifs sans effets secondaires. Une petite clarification sur la propriété sans effet secondaire: il s'agit principalement de la base de données; il ne devrait y avoir aucun changement dans la base de données une fois les tests terminés (l'état doit être conservé). Peut-être que l'évolutivité et la préservation de l'état ne se rejoignent pas, mais je veux vraiment pousser pour une meilleure solution.
Voici un test d'intégration typique (ces tests touchent la couche de base de données):
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();
}
}
Comme on pourrait l'imaginer, cette approche donne des tests extrêmement lents. Et, lorsqu'il est appliqué à l'ensemble des tests d'intégration, il faut environ 5 secondes pour tester uniquement une petite partie du système. Je peux imaginer que ce nombre augmente lorsque la couverture est augmentée.
Quelle serait une autre approche pour écrire de tels tests? Une alternative à laquelle je peux penser est d'avoir des types de variables globales (au sein d'une classe) et toutes les méthodes de test partagent cette variable. En conséquence, seules quelques commandes sont créées et supprimées; résultant en des tests plus rapides. Cependant, je pense que cela introduit un problème plus important; les tests ne sont plus isolés et il devient de plus en plus difficile de les comprendre et de les analyser.
Il se peut simplement que les tests d'intégration ne soient pas destinés à être exécutés aussi souvent que les tests unitaires; par conséquent, de faibles performances pourraient être acceptables pour ceux-ci. Dans tous les cas, ce serait formidable de savoir si quelqu'un a trouvé des alternatives pour améliorer l'évolutivité.