Mon expérience :
- Écriture d'une application critique de 75 000 lignes.
- Depuis le jour où nous avons mis ce programme en production, il a fait ce qu'il devait faire. avec une fiabilité à toute épreuve.
Avertissement : je programme depuis que je suis enfant, je suis donc bon dans mon travail - mais même moi, j'ai été surpris par l'effet spectaculaire de quelques règles de test simples, qui ont permis à l'application de fonctionner de manière aussi fiable qu'une Mercedes haut de gamme.
La forme de test qui a fonctionné pour moi :
- Je n'ai pas fait ce que certains praticiens ont recommandé, à savoir "tester d'abord, coder ensuite". J'ai plutôt adopté l'approche consistant à intégrer autant de tests que possible dans le projet, avant ou après l'écriture du code. Pour certaines méthodes, il était plus facile d'écrire la méthode d'abord, puis les tests. Pour d'autres méthodes, il était plus facile d'écrire les tests d'abord, puis la méthode.
- Je n'ai pas utilisé de frameworks de tests unitaires, j'ai plutôt intégré les tests dans la structure même du programme, comme décrit dans les autres points. Le seul framework que j'ai utilisé est un framework de journalisation tiers pour les avertissements et les erreurs générés. Je ne nommerai pas le cadre commercial que j'ai utilisé, afin de garder cet article neutre, et tout cadre de journalisation gratuit ou commercial fera l'affaire. Je recommande tout cadre de journalisation qui vous permet d'afficher le journal, puis de le filtrer selon certains critères, car cela est très utile lorsque vous recherchez une activité suspecte dans les grands journaux.
- Utilisé tests au niveau des classes : chaque classe avait une méthode qui testait toutes les autres méthodes de la classe. Certaines méthodes avaient une méthode "sœur" qui était responsable de l'exécution des tests sur ladite méthode.
- Utilisé tests au niveau des applications J'ai écrit beaucoup de tests unitaires pour introduire des données réelles dans le programme, puis vérifier que les données qui revenaient étaient conformes aux attentes (généralement, il s'agissait d'un simple contrôle des limites).
- Utilisé test de niveau ligne par ligne : chaque fois que je connaissais la plage de valeurs attendues dans une variable ou un tableau, j'enregistrais un avertissement silencieux si les données sortaient de cette plage. En d'autres termes, les tests unitaires étaient intégrés dans la structure même du code. Ces tests pouvaient être désactivés en mode Release, mais j'ai trouvé que cela n'affectait pas beaucoup la vitesse de l'application finale, alors je les ai laissés activés.
De tous les tests que j'ai ajoutés, j'ai trouvé que les test de niveau ligne par ligne a eu l'effet le plus positif sur la fiabilité de l'application dans son ensemble. Il est étonnant de constater qu'une simple règle telle que "enregistrer un message d'avertissement silencieux si le contenu d'une variable n'est pas ce que vous attendez" peut avoir un effet aussi profond sur la fiabilité de l'application dans son ensemble.
L'avantage de cette approche est qu'elle a permis de raccourcir le cycle de développement. Certes, de nombreuses erreurs et avertissements ont été enregistrés au début, mais une fois ceux-ci corrigés, le résultat final était étonnamment fiable. Cette approche a rendu le programme beaucoup plus robuste aux changements et au remaniement. J'ai perdu le compte du nombre de fois où j'ai modifié quelque chose que je pensais être mineur, ce qui a fait apparaître un avertissement, lequel m'a permis de corriger une erreur qui aurait pu se retrouver en production. La phase habituelle de post-production, qui consiste à passer des mois à trouver des bogues difficiles à localiser, a été pratiquement éliminée. C'était extrêmement important, car il s'agissait d'une application critique avec beaucoup d'enjeux en cas de problème.
La forme de test que j'ai utilisée n'est pas une solution miracle, mais elle vous facilitera la vie (et celle de vos patrons).
En résumé, la seule fois où je n'utiliserais pas les tests, c'est si j'étais une sorte de masochiste travaillant pour mon pire ennemi et que je voulais faire de nos vies un enfer.