Dois-je utiliser TDD?
Je suis le seul développeur de ma (très petite) entreprise et je suis sur le point de commencer sur une taille moyenne ASP.NET application web pour ladite société.
J'essaie de comprendre si je devrais apprendre le développement piloté par les tests (TDD) et l'implémenter dans cette application.
Je dois commencer à développer notre nouvelle application sous peu et je suis inquiet pour les tests. J'ai programmé pendant de nombreuses années mais je n'ai jamais fait de tests unitaires.
J'ai lu de nombreuses ressources en ligne concernant TDD mais Je ne sais pas si je vais avoir une compréhension "assez bonne" sur elle pour le rendre efficace dans l'application.
15 réponses
Cela dépend de l'endroit où se trouvent vos priorités. Si vous êtes intéressé à vous développer en tant que développeur, TDD vaut vraiment la peine d'être examiné si seulement pour l'expérience. Cela vous aidera à repenser la façon dont vous codez et vous fera probablement un meilleur développeur à cause de cela.
Mais cela pourrait facilement être compensé par la quantité de TDD qui entrave votre capacité à sortir votre produit en temps opportun. Vous avez mentionné que vous êtes le seul développeur travaillant dans cette entreprise et cela signifie que le la pression est sur vous pour obtenir votre projet fait. TDD est certainement une grande pratique, mais parfois les contraintes de la vie réelle et la praticité doivent venir en premier.
Donc, en bref, si vous pouvez épargner le temps alors oui, utilisez TDD. En fait, ce n'est pas que beaucoup de frais généraux et vous pouvez toujours sauter les tests dans un pincement. Mais si vous êtes vraiment à court de temps et ne pensez pas que vous serez en mesure de l'intégrer sans mettre votre produit et votre travail à risque, personne ne vous reprocherait de le sauter. Le les puristes seront en désaccord, mais ce n'est pas un monde noir et blanc et parfois des compromis doivent être faits pour faire avancer les choses.
Rappelez-vous ceci: le seul mauvais test est celui que vous n'exécutez pas.
Maintenant, Avez-vous besoin de plonger directement dans TDD? Peut-être pas. Mais vous devriez certainement commencer les tests unitaires ce que vous pouvez. Vous ne pouvez pas très bien tester les interfaces graphiques unitaires, et c'est bien-sauf celles pour UAT.
Mais toute sorte de logique que vous pourriez exécuter dans les coulisses? Yep, vous devez le tester.
Commencez par essayer de tester des méthodes individuelles. Comme vous allez, vous allez commencer à courir dans la douleur, parce que probablement votre le code n'est pas conçu pour être testé. C'est bien; refactorisez votre code! Continuez à le faire jusqu'à ce que puisse tester votre code. Rappelez-vous ce que vous deviez faire et le faire la première fois la prochaine fois que vous écrivez du code.
Après quelques itérations, vous apprendrez ce que vous devez savoir (vraiment, vous ne pouvez l'apprendre en faisant) et la douleur va disparaître. Quand cela se produit, je suggère que vous êtes probablement prêt à regarder dans TDD.
Je ne peux pas assez souligner les avantages d'une méthode de développement basée sur TDD. Lorsque vous adoptez TDD, vos tests unitaires deviennent des citoyens de première classe à côté du code que vous écrivez, au lieu d'être un code qui est maintenu pour avoir des tests unitaires et ne pas être mis à jour.
Dans TDD, vous utilisez vos tests unitaires comme une spécification exécutable de ce que votre composant doit faire. Vous le feriez en considérant ce que vous voulez que votre composant fasse, puis en écrivant des tests à exercer cette fonctionnalité. Puisque votre code n'aura initialement aucune de ces fonctionnalités, tous les nouveaux tests que vous écrivez échoueront ou seront rouges. Une fois que vous avez vos tests, commencez à implémenter le composant. Peu à peu, à mesure que vous ajoutez les fonctionnalités requises, les tests rouges deviennent verts. La bonne chose est qu'après avoir implémenté suffisamment de fonctionnalités pour que tous vos tests passent, vous savez que vous avez terminé la mise en œuvre de la spécification prévue et savez exactement où vous arrêter. Trop souvent J'ai vu des situations où un développeur aura terminé la mise en œuvre de la fonctionnalité requise mais ne s'arrête pas, au lieu d'améliorer le composant et d'ajouter des fonctionnalités supplémentaires et des bonbons pour les yeux, dont aucun ne fait partie de la spécification requise, gaspillant du temps de développement actif.
Une fois que vous avez vos tests unitaires, il est facile de les configurer dans un environnement d'intégration continue. Cet environnement vérifierait le dernier code de votre référentiel, le construirait, puis exécuterait votre unité-tests. Si une régression se produit, si quelqu'un vérifie dans un code qui casse vos tests unitaires, vous le saurez pronto, au lieu de le découvrir après son déploiement dans votre environnement de production. Pour nous assurer que le nouveau code n'introduit pas de régression, nous avons mis en place des crochets de connexion sur notre référentiel pour nous assurer que tout le code soumis a également eu les tests d'accompagnement exécutés et qu'ils passent. Ceci est particulièrement utile lorsque vous avez plusieurs personnes travaillant sur un projet, car ils peuvent voir via n'importe quel tableau de bord de surveillance que vous pouvez utiliser si le référentiel est bon à synchroniser à ce moment-là ou non. Il est également facile de localiser une version particulière du référentiel qui fonctionne, laissant les gens travailler avec des versions connues, tandis que quelqu'un d'autre travaille à résoudre tout problème qui casse actuellement votre build. Cela signifierait également potentiellement que toute construction "verte" indiquée par le tableau de bord est une construction qui a une très bonne probabilité de ne pas rencontrer de problèmes lorsqu'il est poussé dans un environnement de production.
Beaucoup de gens pensent que l'adoption de TDD signifierait plus de travail et de tracas, et que cela prendrait plus de temps. Considérez cependant que le temps supplémentaire passé à écrire des tests empêchera toute fonctionnalité Testée de se casser, et que vous trouveriez ces pauses plus tôt, plutôt que plus tard.
Un autre avantage de l'utilisation de TDD est que vous accorderez beaucoup plus d'attention à votre design, et qu'il serait beaucoup mieux structuré et componentized sur une approche non-TDD. Cette componentization est importante pour pouvoir avoir une suite de tests unitaires rapide à exécuter et non fragile.
Le test GUI est difficile, mais pas impossible. Considérez les technologies de test Web-UI telles que Selenium, WebDriver et Watir, qui peuvent exercer web-UIs par programmation. Il est facile d'abuser de ces outils aussi, en effectuant seulement des tests de bout en bout coûteux en les utilisant. Une bien meilleure approche consiste à abstraire votre couche D'interface utilisateur afin qu'elle peut être testé isolément, indépendamment de votre logique métier. Vous ne voulez pas qu'un test D'interface utilisateur effectue des opérations sur une base de données.
Pour re-cap, vous voulez écrire des tests unitaires efficaces pour rendre l'utilisation de TDD une expérience agréable, plutôt qu'un fardeau. Vos tests devraient être rapides, tester les composants isolément et devraient idéalement être exécutés tout le temps.
Ce que j'ai décrit ici est un cas idéal. Vous n'avez pas à adopter toutes les idées mentionnées, mais vous pouvez choisir et choisissez ce qui fonctionne pour rendre votre processus de développement plus efficace.
Notez que TDD ne concerne pas les tests; c'est un processus de développement. Le test n'est pas fait pour remplacer la fonction de test c'est ce qui définit le dev processus.
On dirait que vous parlez de tests unitaires et d'autres tests automatisés. Le test est bon. Les tests automatisés sont bons. N'ayez pas peur de faire des erreurs. Si vous pensez à votre code et à la façon d'automatiser les tests autant que possible, vous êtes dans une bonne position-mais il y a une coupure de diminution retourner. Les tests automatisés à 100% ne sont probablement pas rentables-en particulier pour une organisation que vous décrivez.
Si vous parlez vraiment de TDD (ce que les experts appelleraient TDD), cela peut aussi être bon. Il existe de nombreux processus de développement. Il est bon de se rappeler que les processus de développement sont des cadres et des guides - pas une religion à suivre comme une quête. Aucun processus n'est d'une taille convient à tous. Faites ce qui a du sens pour vous et améliorez-vous au fur et à mesure. Avoir une seule personne dans une organisation de développement rend le processus de changement assez indolore. Abordez vos problèmes à haut risque et mettez un processus léger en place pour ceux avant d'aller après les problèmes de faible valeur.
La meilleure façon d'apprendre est de faire. Si vous avez beaucoup lu dessus, il est temps de plonger - et en tant que développeur unique, avoir des tests unitaires peut être une aubaine, car il n'y a pas une autre paire d'yeux pour regarder votre code.
Je suis toujours un nouveau développeur et je suis entré dans une entreprise où le développement d'applications était déjà en cours. TDD m'aide à m'assurer que les nouveaux changements ne cassent pas ce qui a déjà été fait et que je travaille le long, cela aide à faire des amounts massifs de chasse aux bogues lorsque j'ajoute ou modifie du code.
J'ai aimé tout ce que j'ai appris et je recommande fortement de prendre le temps d'apprendre TDD.
-mon .02
Un seul développeur est en fait un effort de développement de taille assez petite. Même si vous vous attendez à beaucoup d'écrans, il faut encore beaucoup de temps à un seul codeur pour entrer dans quelque chose de moyen (à moins qu'ils ne soient devenus fous avec le découpage et le collage).
Je ne suis pas un grand fan de TDD, mais si vous êtes un programmeur relativement nouveau (moins de 10 ans), vous êtes seul et vous vous inquiétez des problèmes de qualité, je suis sûr que cela vous ralentira, mais vous aidera également à améliorer votre travail. Pour les plus jeunes programmeurs cela les oblige à se concentrer plus intensément sur le comportement sous-jacent réel du code et à le faire fonctionner une étape à la fois (une erreur commune précoce est trop de livres en quantités massives de code, puis essayez de tout déboguer en même temps. Les vieux codeurs peuvent s'en sortir, les jeunes ont généralement besoin de travailler sur des morceaux plus petits à la fois). Les Fans disent souvent que cela a grandement changé la façon dont ils codent (ce qui facilite généralement le travail global). À tout le moins, vous pourriez commencer avec, et le fossé plus tard si ce n'est pas le cas vraiment aider.
Votre plus gros problème, pour lequel TDD n'aidera pas, est d'obtenir une bonne structure architecturale pour l'application web. Un que vous ne voudrez pas jeter dans cinq mois. Les applications Web peuvent être très difficiles, peu de gens l'obtiennent dans les dix ou douze premières fois.
J'ai récemment commencé à utiliser TDD aussi bien sur tout le nouveau code. Oui Au début, il semblait que c'était juste une perte de temps puisque toute ma logique était trop étroitement couplée à l'interface graphique, donc je ne pouvais pas écrire de tests unitaires qui pourraient vraiment garantir que mon code fait ce qu'il devrait faire.
Mais après un moment, j'ai réalisé que l'écriture de tests unitaires était une telle douleur parce que le code était mal écrit. J'ai commencé à refactoriser mon code de telle manière que je puisse écrire des tests unitaires pour cela qui importait. J'ai commencé à raccourcir mes méthodes, utiliser davantage les interfaces et essayer de séparer la logique autant que possible de l'interface graphique.
Je pense que le but d'utiliser des tests unitaires à côté de tester et de valider votre code est de vous faire un meilleur programmeur global. Donc, de toute façon, cela vaut la peine de l'apprendre.
Je pensais résumer et commenter certains des commentaires ci-dessus:
- Oui TDD est sur le Design. Il n'est pas sur le test.
- Je ne sais pas pourquoi QA s'impliquait dans la phase de conception de George. On dirait qu'ils spécifiaient des tests automatisés. Comme Tim l'a souligné, c'est un processus de développement.
- Kevin, tu as dit "sauter les tests". Une fois de plus. TDD est sur la conception, il est pas sur les tests. OK, vous pouvez sauter le design, mais l'application terminée sera boguée et insupportable.
- Roshan a mentionné ‘ 'spécification exécutable de ce que votre composant devrait faire'. Cela signifie une documentation entièrement à jour. Lorsque vous êtes nouveau dans un projet, vous pouvez vous mettre à jour très rapidement, vous pouvez voir exactement ce que le développeur original avait l'intention. Et, comme jon l'a mentionné, vous pouvez apporter des modifications au code et vous assurer que rien n'est cassé.
Avez-vous des composants qui sont facilement testables à l'unité? Pouvez-vous construire votre application à un ensemble de composants testables? C'est vraiment l'état d'esprit à penser lorsque vous travaillez dans un environnement TDD.
Il est facile de dire " c'est une application GUI! c'est impossible de tester mes affaires"! Cela peut être une prophétie auto-réalisatrice. Certes, vous ne pouvez pas facilement unittest la mise en page de tous vos widgets, mais combien de votre programme est lié à la façon dont vos widgets sont disposés? Vous pouvez vous empêcher de faire bon TDD parce que certains aspects est trop étroitement couplé à la mise en page de vos widgets GUI, ou son trop étroitement couplé à quelque chose d'autre pas facilement unittestable. Arrêtez-vous et défiez-vous -- est-ce vraiment le cas? Puis-je compartimenter et modulariser mon code de sorte qu'il puisse être mieux isolé de ces parties du système? Est-il approprié de le faire (les gains des tests unitaires méritent-ils le coût?). N'acceptez pas carte blanche que c'est impossible juste parce que votre logiciel est lié à non-unittestable composant.
La surcharge de TDD diminue à mesure que vous gagnez de l'expérience, et devient bientôt inférieure à la surcharge de ne pas développer en utilisant TDD.
Cependant, les frais généraux pour commencer peuvent être importants, vous perdrez du temps à faire les choses dans le mauvais sens par manque d'expérience. Un projet critique est un endroit risqué pour inclure le temps qu'il faut pour apprendre une nouvelle technique d'élaboration
Si cela est fait de manière pragmatique, cela peut être un énorme avantage. L'argument contre cela semble toujours être que cela prend trop de temps, mais comme nous le savons tous, si de nombreux cas sacrifiant sciemment la qualité peuvent être encore plus préjudiciables.
Cela fait 3 ans que J'ai appris TDD et je peux honnêtement dire que je l'ai vu apporter une valeur énorme et je l'ai aussi vu être une perte de temps complète.
Voici un exemple de chacun...
Bénéfique: travailler sur une solution qui était assez complexe, avait beaucoup dépendances et variations et était en constante évolution. Concevoir avec des tests à l'esprit et avoir une suite de tests unitaires de régression nous a permis de nous adapter pour changer rapidement et être en mesure de refactoriser le code pour une maintenabilité accrue. Nous avons utilisé la règle 80/20 lors de la création de tests unitaires et laissé de côté les cas de test de faible valeur.
Pas bénéfique: il a été (dogmatiquement) décidé que nous devions avoir un test automatisé pour chaque cas de test auquel QA pourrait penser, même les cas D'interface utilisateur. De nombreux cas étaient si rudimentaires et impliqué très peu, code très simple. Obtenir beaucoup d'entre eux au travail a nécessité de grandes quantités de configuration et a augmenté la quantité de tests pour maintenir tant qu'il nous ralentissait de manière significative.
TDD est une excellente pratique et je ne peux pas en parler assez.
Cependant, si j'étais dans votre position, Je ne m'inquiéterais pas tellement de TDD pour l'instant et je me concentrerais plutôt sur de bons tests unitaires autour de votre code.
Vous pouvez toujours commencer à utiliser TDD un peu plus tard dans votre projet, lorsque la logique métier délicate se présente.
Je ne voudrais pas que vous ayez une mauvaise expérience de TDD, ce qui pourrait arriver si vous êtes sous pression de livraison et n'avez aucune expérience dans à l'aide de la pratique.
Ce pourrait être une idée d'essayer quelques Katas TDD à la maison pour se familiariser avec elle, avant de l'utiliser au travail.
Quelques bonnes Katas peuvent être trouvés ici
TDD, pseudo TDD et quasi TDD. Beaucoup d'approches différentes. Cela dépend juste de qui applique le niveau de TDD. Beaucoup d'avantages et d'inconvénients aussi, encore une fois cela dépend de votre personnel. C'est une de ces philosophies à double tranchant. Si vous ne savez pas ce que vous faites ou s'il y a un niveau de compréhension distinct au sein de votre groupe, cela vous enlèvera et conduira à des luttes internes, ce qui finira par conduire à la suppression totale de TDD. Aussi TDD est différent de (juste écrire des tests).