J'ai introduit des tests unitaires dans des bases de code qui ne l'avaient pas auparavant. Le dernier grand projet auquel j'ai participé et où je l'ai fait, le produit était déjà en production avec zéro test unitaire lorsque je suis arrivé dans l'équipe. Quand je suis parti - 2 ans plus tard - nous avons eu plus de 4500 tests donnant une couverture de code d'environ 33% dans une base de code avec 230 000 + production LOC (application financière Win-Forms en temps réel). Cela peut sembler faible, mais le résultat a été une amélioration significative de la qualité du code et du taux de défauts, ainsi qu'une amélioration du moral et de la rentabilité.
Cela peut être fait lorsque vous avez à la fois une compréhension et un engagement précis de la part des parties concernées.
Tout d'abord, il est important de comprendre que les tests unitaires sont une compétence en soi. Vous pouvez être un programmeur très productif selon les normes «conventionnelles» et avoir encore du mal à écrire des tests unitaires d'une manière qui évolue dans un projet plus vaste.
De plus, et spécifiquement pour votre situation, l'ajout de tests unitaires à une base de code existante qui ne contient aucun test est également une compétence spécialisée en soi. À moins que vous ou quelqu'un de votre équipe n'ayez une expérience réussie de l'introduction de tests unitaires dans une base de code existante, je dirais que la lecture du livre de Feather est une exigence (non facultative ou fortement recommandée).
Faire la transition vers les tests unitaires de votre code est un investissement dans les personnes et les compétences tout autant que dans la qualité de la base de code. Comprendre cela est très important en termes de mentalité et de gestion des attentes.
Maintenant, pour vos commentaires et questions:
Cependant, je crains que je finisse par manquer la vue d'ensemble et que je manque des tests fondamentaux qui auraient été inclus si j'avais utilisé TDD dès le départ.
Réponse courte: Oui, vous manquerez des tests et oui, ils pourraient ne pas ressembler initialement à ce qu'ils auraient dans une situation de champ vert.
La réponse au niveau plus profond est la suivante: cela n'a pas d'importance. Vous commencez sans tests. Commencez à ajouter des tests et à refactoriser au fur et à mesure. À mesure que les niveaux de compétence s'améliorent, commencez à élever la barre pour tout le code nouvellement écrit ajouté à votre projet. Continuez à vous améliorer etc ...
Maintenant, en lisant entre les lignes ici, j'ai l'impression que cela vient de la mentalité de "la perfection comme excuse pour ne pas agir". Un meilleur état d'esprit est de se concentrer sur la confiance en soi. Donc, comme vous ne savez peut-être pas encore comment le faire, vous saurez comment faire au fur et à mesure et remplissez les blancs. Par conséquent, il n'y a aucune raison de s'inquiéter.
Encore une fois, c'est une compétence. Vous ne pouvez pas passer de zéro test à la perfection TDD en une seule approche de livre de cuisine «processus» ou «étape par étape» de manière linéaire. Ce sera un processus. Vos attentes doivent être de faire des progrès et des améliorations graduels et progressifs. Il n'y a pas de pilule magique.
La bonne nouvelle est qu'au fur et à mesure que les mois (et même les années) passent, votre code commencera progressivement à devenir un code «correct», bien factorisé et bien testé.
En remarque. Vous constaterez que le principal obstacle à l'introduction de tests unitaires dans une ancienne base de code est le manque de cohésion et les dépendances excessives. Vous constaterez donc probablement que la compétence la plus importante sera de savoir comment briser les dépendances existantes et découpler le code, plutôt que d'écrire les tests unitaires eux-mêmes.
Existe-t-il des processus / étapes à suivre pour garantir qu'une solution existante est correctement testée à l'unité et pas seulement intégrée?
Sauf si vous l'avez déjà, configurez un serveur de build et configurez une build d'intégration continue qui s'exécute à chaque archivage, y compris tous les tests unitaires avec couverture de code.
Formez votre personnel.
Commencez quelque part et commencez à ajouter des tests pendant que vous progressez du point de vue du client (voir ci-dessous).
Utilisez la couverture de code comme référence pour savoir dans quelle mesure votre base de code de production est testée.
Le temps de construction doit toujours être RAPIDE. Si votre temps de construction est lent, vos compétences en tests unitaires sont à la traîne. Trouvez les tests lents et améliorez-les (découpler le code de production et tester de manière isolée). Bien écrit, vous devriez facilement pouvoir avoir plusieurs milliers de tests unitaires et terminer une compilation en moins de 10 minutes (~ 1-quelques ms / test est une bonne ligne directrice mais très approximative, quelques exceptions peuvent s'appliquer comme le code utilisant la réflexion, etc. ).
Inspectez et adaptez-vous.
Comment puis-je m'assurer que les tests sont de bonne qualité et ne sont pas simplement un cas de test, mieux que pas de tests.
Votre propre jugement doit être votre principale source de réalité. Aucune métrique ne peut remplacer la compétence.
Si vous n'avez pas cette expérience ou ce jugement, envisagez de faire appel à quelqu'un qui en a.
Deux indicateurs secondaires approximatifs sont la couverture totale du code et la vitesse de construction.
Cela en vaut-il la peine pour une solution existante en production?
Oui. La grande majorité de l'argent dépensé pour un système ou une solution sur mesure est dépensée après sa mise en production. Et investir dans la qualité, les personnes et les compétences ne devrait jamais être démodé.
Serait-il préférable d'ignorer les tests de ce projet et de l'ajouter dans une éventuelle réécriture future?
Il faudrait tenir compte non seulement de l'investissement en personnel et en compétences, mais surtout du coût total de possession et de la durée de vie prévue du système.
Ma réponse personnelle serait «oui bien sûr» dans la majorité des cas parce que je sais que c'est tellement mieux, mais je reconnais qu'il pourrait y avoir des exceptions.
Ce qui sera plus bénéfique; passer quelques semaines à ajouter des tests ou quelques semaines à ajouter des fonctionnalités?
Ni. Votre approche devrait être d'ajouter des tests à votre base de code pendant que vous progressez en termes de fonctionnalités.
Encore une fois, il s'agit d'un investissement dans les personnes, les compétences ET la qualité de la base de code et en tant que tel, il faudra du temps. Les membres de l'équipe doivent apprendre à briser les dépendances, à écrire des tests unitaires, à apprendre de nouvelles habitudes, à améliorer la discipline et la sensibilisation à la qualité, à mieux concevoir des logiciels, etc. Il est important de comprendre que lorsque vous commencez à ajouter des tests, les membres de votre équipe ne le font probablement pas avoir ces compétences au niveau qu'elles doivent être pour que cette approche réussisse, donc arrêter les progrès pour passer tout le temps à ajouter beaucoup de tests ne fonctionnera tout simplement pas.
En outre, l'ajout de tests unitaires à une base de code existante de toute taille de projet importante est une entreprise de grande taille qui nécessite un engagement et de la persévérance. Vous ne pouvez pas changer quelque chose de fondamental, attendez-vous à beaucoup d'apprentissage en cours de route et demandez à votre sponsor de ne pas s'attendre à un retour sur investissement en interrompant le flux de valeur commerciale. Cela ne volera pas, et franchement cela ne devrait pas.
Troisièmement, vous souhaitez inculquer de solides valeurs d’orientation commerciale à votre équipe. La qualité n'est jamais au détriment du client et vous ne pouvez pas aller vite sans la qualité. De plus, le client vit dans un monde en mutation et votre travail consiste à lui faciliter l'adaptation. L'alignement client nécessite à la fois la qualité et le flux de valeur commerciale.
Ce que vous faites, c'est rembourser la dette technique. Et vous le faites tout en répondant aux besoins en constante évolution de vos clients. Au fur et à mesure que la dette est remboursée, la situation s'améliore et il est plus facile de mieux servir le client et d'offrir plus de valeur. Etc. Cette dynamique positive est ce que vous devez viser car elle souligne les principes du rythme durable et maintiendra et améliorera le moral - à la fois pour votre équipe de développement, votre client et vos parties prenantes.
J'espère que cela pourra aider