Je suis passé par différents extrêmes durant ma carrière (je bosse actuellement moi aussi dans une start-up). Nous sommes depuis 4 ans sur le même projet, à empiler des codes et développer des fonctionnalités.
Nous avons commencé dans une optique très dogmatique, tests unitaires à outrance, tout devait absolument être abstrait et mockable et nous avons fini changer d'approche. A présent nous avons choisi de cesser de s'imposer du test unitaire, et de faire plus de tests d'intégration.
En gros, 80% de nos tests sont des tests d'intégration qui se passent sur les couches les plus hautes de nos applications. Nous avons différentes test suites qui chargent un script SQL dans la base de données avec des enregistrements intéressants et nous lançons une batterie de test.
Nous avons opté pour cette approche car fabriquer en java des collections entières de faux objets pour nos mocks était très fastidieux et vu le modèle de développement très évolutif que nous suivions, la maintenance des tests devenait trop lourde.
Là on se contente d'avoir un script SQL h2 (pour les tests en mémoire sans dépendances spécifiques sur le poste de dev) et un script Postgresql pour les tests en condition plus... réelles, tous sont commités et versionnés dans notre source control. On a estimé que ça nous coûtait moins cher de populer une base avec des cas intéressants que maintenir des tonnes de Mocks. Et ça permet aussi de tester nos évolutions de schéma ce qui n'est pas insignifiant. Au démarrage d'une suite de test (du simple Junit en fait), on refabrique la DB, on lance nos traitements et on laisse les tests modifier réellement la DB, qui est détruite à la fin. Certains pourraient penser que c'est lourd, mais en fait c'est très rapide.
Cela nous permet de tester nos applications avec de vrais interactions qui passent par toutes les couches (y compris les DAO et les transactions SQL) et par rapport à des tests qui se feraient uniquement en mémoire, cela nous a sauvé la mise plusieurs fois.
Donc voilà, je peux pas généraliser cela à tous les projets sur terre, mais sur une application très orientée DB qui change beaucoup, je pense que c'est 80% du bénéfice pour 20% du boulot. En tout cas on a un bon compromis avec cette approche, même si elle n'est pas très académique. Elle permet de tester des cas d'utilisation réels qui traversent toutes les couches, et elle impose assez peu de contraintes de maintenance. Je peux refactorer lourdement sous le capot sans avoir besoin de beaucoup changer les tests, justement parce qu'ils se focalisent sur les couches hautes.
Partager