Le problème clé du code hérité est qu’il n’a pas de test. Vous devez donc en ajouter (et plus encore ...).
Cela en soi prendrait beaucoup de travail, comme @mattnz l'a noté. Mais le problème particulier du code existant est qu’il n’a jamais été conçu pour être testé . En règle générale, il s’agit d’un énorme gâchis complexe de codes spaghetti, dans lequel il est très difficile, voire impossible, d’isoler les petites pièces à tester. Donc, avant de tester les unités, vous devez reformuler le code pour le rendre plus testable.
Cependant, pour pouvoir refactoriser en toute sécurité, vous devez passer des tests unitaires afin de vérifier que rien n'a été cassé avec vos modifications ... Il s'agit de la capture 22 du code hérité.
Le livre vous apprend à sortir de cette situation en apportant les modifications minimales, les plus sûres, au code, juste pour activer les premiers tests unitaires. Celles-ci ne sont pas conçues pour rendre la conception plus agréable, mais uniquement pour permettre des tests unitaires. En fait, ils rendent parfois le design plus laid ou plus complexe. Cependant, ils vous permettent d’écrire des tests - et une fois que vous avez mis en place des tests unitaires, vous êtes libre d’améliorer la conception.
Il existe de nombreuses astuces pour rendre le code testable - certaines sont évidentes, d'autres pas du tout. Il y a des méthodes que je n'aurais jamais pensé à moi-même sans lire le livre. Mais ce qui est encore plus important, c’est que Feathers explique en quoi une unité de code peut être testée. Vous devez couper les dépendances et introduire des barrières dans votre code, mais pour deux raisons distinctes:
- détection - afin de vérifier et de vérifier les effets de l'exécution d'un morceau de code, et
- séparation - afin d’obtenir d’abord le code spécifique dans un harnais de test.
Réduire les dépendances en toute sécurité peut être délicat. L'introduction d'interfaces, de simulacres et d' injection de dépendance est un objectif simple et agréable, mais qui n'est pas nécessairement sans danger pour le moment. Nous devons donc parfois recourir à la sous-classe de la classe testée afin de remplacer une méthode qui normalement déclencherait par exemple une demande directe à une base de données. D'autres fois, nous pourrions même avoir besoin de remplacer une classe de dépendance / jar par une fausse dans l'environnement de test ...
Pour moi, le concept le plus important introduit par Feathers sont les coutures . Une couture est un endroit dans le code où vous pouvez changer le comportement de votre programme sans modifier le code lui-même . Construire des coutures dans votre code permet de séparer le code sous test, mais également de détecter le comportement du code sous test même lorsqu'il est difficile ou impossible de le faire directement (par exemple parce que l'appel modifie un autre objet ou sous-système , dont l’état n’est pas possible d’interroger directement à partir de la méthode de test).
Cette connaissance vous permet de remarquer les germes de la testabilité dans le plus méchant tas de code et de rechercher les modifications minimales, les moins gênantes et les plus sûres pour y parvenir. En d'autres termes, pour éviter de faire des refactorisations "évidentes" qui risquent de rompre le code sans vous en rendre compte - car vous n'avez pas encore les tests unitaires pour le détecter.