Chapitre Les tests d'intégration avec JUnit
Comment concevoir un code testable
Cette leçon propose des conseils pratiques pour concevoir son code de telle manière qu'il soit aisément testable.
Concevoir un code testable
Qu'est ce que la testabilité
C'est le coût et la relative facilité à révéler les bugs logiciels.
D'après un cours d'électronique lien, c'est :
- Améliorer l'accessibilité entre chaque module
- La capacité à contrôler : capacité à manipuler les interfaces des modules en générant des entrées
- L'observabilité : capacité à déterminer les valeurs internes d'un module en contrôlant les entrées et observant les sorties

Adaptation of Software Testability Concept for Test Suite Generation
Limiter l'utilisation de variables d'états
Les études montrent que l'utilisation d'états globaux (statiques) ou locaux (thread local etc) nuisent à l'observabilité de l'application. La programmation fonctionnelle , au contraire met en avant les entrées et sorties des composants.
La séparation des préoccupations
Créer des API claires
Des approches comme TDD force le développeur à réfléchir sur comment utiliser son propre code. Il en découle la création d'interfaces et d'API testables.

MSC Thesis Emmanuel Mulo
Implémenter la traçabilité
Pour implémenter la tracabilité, nous sommes intéressés par découvrir quel module, quel composant, implémente quelle spécification. Sans cette information, il est pratiquement impossible de développer des plans de tests précis.
Ajouter du monitoring interne
Même si nous réalisons des tests boite noire de l'application, chaque module doit venir avec les éléments nécessaires pour :
- logging
- monitoring
- tracing, capture / replay
- audit trail...

Design for Testability in Object Oriented Systems
Le code doit être auto-documenté
La documentation périme mais le code reste. Plus le code est facile à lire et les concepts de l'application faciles à extraire, plus l'application sera facilement testable.
Choisir la composition plutôt que l'héritage
L'héritage s'il semble pratique au premier abord complexifie la tâche du testeur car il n'est pas possible de substituer une implémentation par un stub. La composition offre
Eviter tout ce qui est statique et singleton
Créer un composant d'initialisation de votre application et utiliser l'injection de dépendance.
Isoler les dépendances.
Créer des "murs" entre les modules via une API de programmation claire et facile d'utilisation
Injecter les dépendances
Exposer clairement les dépendances des composants si possible via constructeur ou méthodes de construction (factory methods).
**Ressources intéressantes : **