TDD / Teste-t-il trop de frais généraux / de maintenance?

24

Vous l'avez donc entendu à plusieurs reprises de la part de ceux qui ne comprennent pas vraiment les valeurs des tests. Pour commencer, je suis un adepte de l'agilité et des tests ...

J'ai récemment eu une discussion sur la réalisation de TDD sur une réécriture de produit où l'équipe actuelle ne pratique pas les tests unitaires à aucun niveau, et je n'ai probablement jamais entendu parler de la technique d'injection de dépendance ou des modèles de test / conception, etc. (nous n'obtiendrons même pas sur pour nettoyer le code).

Maintenant, je suis entièrement responsable de la réécriture de ce produit et on me dit que l'essayer à la manière de TDD, en fera simplement un cauchemar de maintenance et impossible pour l'équipe. De plus, comme il s'agit d'une application frontale (non basée sur le Web), l'ajout de tests est inutile, car le dynamisme de l'entreprise change (par changements, ils signifient des améliorations bien sûr), les tests deviendront obsolètes, d'autres développeurs qui viendront à le projet à l'avenir ne les maintiendra pas et deviendra plus un fardeau pour eux à réparer, etc.

Je peux comprendre que TDD dans une équipe qui n'a actuellement aucune expérience de test ne semble pas bon, mais mon argument dans ce cas est que je peux enseigner ma pratique à ceux qui m'entourent, mais plus encore, je sais que TDD fait MIEUX Logiciel. Même si je devais produire le logiciel en utilisant TDD et jeter tous les tests pour le remettre à une équipe de maintenance, ce serait sûrement une meilleure approche que de ne pas utiliser TDD du tout?

J'ai été abattu car j'ai mentionné faire du TDD sur la plupart des projets pour une équipe qui n'en avait jamais entendu parler. La pensée des "interfaces" et des constructeurs DI étranges les effraie ...

Quelqu'un peut-il m'aider s'il vous plaît dans ce qui est normalement une très courte conversation d'essayer de vendre TDD et mon approche aux gens? J'ai généralement une très courte fenêtre de discussion avant de tomber à genoux devant l'entreprise / l'équipe.

Martin Blore
la source
3
COURIR! FUIR! Quiconque ne comprend pas pourquoi les tests automatisés faciliteront leur vie à long terme doit retirer sa tête de vous-savez-où.
MattC
6
@MattC TDD! = Tests automatisés
Nemanja Trifunovic
@Nemanja Trifunovic: Euh ... qui pratique le TDD à l'aide de tests manuels? "J'ai démarré l'application mais il n'y a pas de bouton sur lequel cliquer !?" "Oui, c'est le rouge en rouge, vert, refactor!"
Steven Evers
2
@SnOrfus: Il existe des tests automatisés sans TDD. Quelques exemples: tests d'intégration automatisés, tests de régression, tests de stress.
Nemanja Trifunovic
2
@Martin, je serais intéressé par un commentaire de suivi (ou un article de blog) qui explique ce que vous avez fini par faire et dans quelle mesure (ou non) cela a fonctionné pour vous à long terme.
StevenV

Réponses:

36

l'essayer à la manière de TDD, en fera simplement un cauchemar de maintenance et impossible pour l'équipe à maintenir.

Vous ne pouvez pas gagner cet argument. Ils inventent ça. Malheureusement, vous n'avez pas non plus de faits réels. Tout exemple que vous fournissez peut être contesté.

La seule façon de faire valoir ce point est d'avoir du code qui est moins coûteux à maintenir.

De plus, comme il s'agit d'une application frontale (non basée sur le Web), l'ajout de tests est inutile,

Tout le monde le dit. Cela peut aussi être partiellement vrai. Si l'application est raisonnablement bien conçue, le front-end fait très peu.

Si l'application est mal conçue, cependant, le front-end en fait trop et est difficile à tester. Il s'agit d'un problème de conception, pas d'un problème de test.

au fur et à mesure que la dynamique commerciale change (par des changements, ils signifient des améliorations bien sûr), les tests deviendront obsolètes, d'autres développeurs qui viendront dans le projet à l'avenir ne les maintiendront pas et deviendront plus un fardeau pour eux à réparer, etc.

C'est le même argument que ci-dessus.


Vous ne pouvez pas gagner l'argument. Alors ne discutez pas.

"Je suis entièrement responsable de la réécriture de ce produit"

Dans ce cas,

  1. Ajoutez quand même des tests. Mais ajoutez des tests au fur et à mesure, progressivement. Ne passez pas longtemps à faire passer des tests en premier. Convertissez un peu. Testez un peu. Convertissez un peu plus. Testez un peu plus.

  2. Utilisez ces tests jusqu'à ce que quelqu'un comprenne que le test fonctionne et demande pourquoi les choses vont si bien.

J'ai eu le même argument sur une réécriture (de C ++ à Java) et j'ai simplement utilisé les tests même s'ils m'ont dit de ne pas le faire.

Je me développais très rapidement. J'ai demandé des exemples concrets de résultats corrects, qu'ils ont envoyés dans des feuilles de calcul. J'ai transformé les feuilles de calcul en unittest.TestCase (sans leur dire) et les utilise pour tester.

Quand étaient dans les tests d'acceptation des utilisateurs - et des erreurs ont été trouvées - je viens de demander que les feuilles de calcul avec les exemples soient examinées, corrigées et développées pour couvrir les problèmes rencontrés lors du test d'acceptation. J'ai transformé les feuilles de calcul corrigées en unittest.TestCase (sans leur dire) et les utilise pour tester.

Personne n'a besoin de savoir en détail pourquoi vous réussissez.

Soyez juste réussi.

S.Lott
la source
Réponse très inspirante là S.Lott :). Il était intimidant pour moi d'être informé par un architecte d'entreprise que je "créerais des frais généraux inutiles". Je ne pouvais pas être vu comme retardant le projet avec des inconnues pour eux, qu'en fin de compte, si le projet arrivait en retard, ils pourraient simplement pointer du doigt les tests que j'ai effectués et mettre fin au contrat. Comme vous le dites, les faufiler pour prouver plus tard comment cela a aidé est probablement la bonne façon. Vous avez tout à fait raison du point de vue de l'argument, je n'ai aucun motif, et eux non plus.
Martin Blore
Pourquoi le front-end fait-il trop de problèmes de conception? De nos jours, de nombreuses technologies comme AJAX font beaucoup en front-end.
卢 声 远 Shengyuan Lu
@ 卢 声 远 Shengyuan Lu: Il est difficile de tester le "look" de l'interface graphique. Vous pouvez tester les polices et les couleurs. Cependant, les particularités du navigateur rendent très difficile le test de l'emplacement et de la taille exacts avec des tests automatisés.
S.Lott
@Martin Blore: "eux non plus." Précisément. Quiconque dit que les tests ajouteront en quelque sorte par magie un risque est fou. Il faut quand même tester - c'est incontournable. Vous pouvez bien tester (en utilisant TDD) ou vous pouvez tester mal et au hasard. Planifier de mauvais tests au hasard me semble plus risqué. Mais il n'y a pas de discussion de base avant que les «non-diseurs» aient une expérience pratique.
S.Lott
5

Vous ne pouvez convaincre ces personnes (le cas échéant) que du point de vue pratique, démontrant la valeur du TDD dans la vie réelle. Par exemple, en prenant un bug récent comme exemple, et en montrant comment construire un test unitaire qui garantit à 100% que ce bug n'apparaîtra plus jamais. Et puis, bien sûr, écrivez une douzaine de tests unitaires supplémentaires pour empêcher toute la classe de bogues similaires d'apparaître (et qui sait, peut-être même en train de découvrir quelques bogues dormants supplémentaires dans le code).

Si cela ne fonctionne pas à court terme, vous devez y travailler plus longtemps, simplement en effectuant TDD et en écrivant des tests unitaires avec diligence sur vos propres tâches. Ensuite, compilez quelques statistiques simples au bout de six mois environ (si cela est possible dans votre environnement) pour comparer les taux de bogues dans le code / les tâches accomplies par différents développeurs (anonimyzed pour éviter d'aliéner vos coéquipiers). Si vous pouvez faire remarquer qu'il y avait beaucoup moins de bogues trouvés dans votre code que dans d'autres, vous pourriez avoir un point fort à vendre à la fois à la direction et aux autres développeurs.

Péter Török
la source
C'est une excellente idée Peter, merci pour ça. Mon projet actuel a une équipe de test, donc je suis sûr qu'il serait assez facile de capturer les bogues trouvés dans les versions intermédiaires, etc.
Martin Blore
3

Vous devez être pratique sur ces choses, TDD est une bonne chose à avoir en théorie, mais à moins que vous ne mettiez à jour vos tests pour tout ce qui est ajouté, cela ne sert à rien - personne ne veut exécuter un test qui signale des pannes code quand c'est le test qui n'a pas été mis à jour! En conséquence, cela peut facilement être trop coûteux - vous ne serez pas le seul développeur à travailler sur ce code.

Le client a une équipe de test .. eh bien, il n'y a aucun problème à déplacer la charge de test du développeur vers les testeurs - c'est pour cela qu'ils sont là après tout, et s'ils trouvent des bugs à travers leurs tests (peut-être qu'ils ont beaucoup de outils de tests automatisés), il est inutile d’écrire des tests unitaires à votre niveau. Il faudra un peu plus de temps pour trouver les bogues, mais ils trouveront ces bogues "d'intégration" embêtants que vos tests n'auraient pas exercés.

Il y a de fortes chances pour qu'elles ne se soucient pas des tests unitaires.

Enfin, TDD est une chose nouvelle, quand j'étais enfant, nous n'avions jamais testé et nous avons écrit du code qui fonctionnait. Les tests unitaires font que certaines personnes se sentent chaleureuses et floues, mais ce n'est absolument pas une exigence pour un code correct.

PS. Je vois une autre de vos questions où vous critiquez les couches d'abstraction, et ici vous critiquez le manque de constructeurs DI! Faites votre choix :)

gbjbaanb
la source
2

Puisque tout change si rapidement que vous le dites, expliquez-leur qu'il sera utilisé pour les tests de régression. Ce qui permettra d'économiser beaucoup de maux de tête lorsque de nouveaux bogues sont introduits car quelqu'un a rompu une ligne de code écrite il y a 10 ans pour résoudre un problème qui se produit 1 sur 10 000 000 d'exécutions d'une fonction spécifique qui n'est appelée que si l'horloge système est allumée. le client a une différence supérieure à 3 minutes par rapport à l'horloge système du serveur. Demandez-leur simplement combien de clients ils peuvent se permettre de perdre à cause d'un logiciel buggy.

Woot4Moo
la source
2

Soulignez que la découverte d'un bogue pendant le développement coûte X, pendant les tests 10X et après le déploiement 100X. Voyez s'ils vous permettront au moins de mener un test pilote où vous implémentez TDD dans un module spécifique, puis effectuez des comparaisons avec d'autres modules au fur et à mesure qu'ils sont développés, testés, déployés et pris en charge. Avec des données adéquates, vous devriez pouvoir démontrer comment moins d'efforts ont été utilisés pour produire du code dans le module TDD. Bonne chance.

SnoopDougieDoug
la source
2

Oui, le maintien des tests est un fardeau. Les mettre à jour, mettre à jour vos données de test: tout cela vous fait perdre du temps.

L'alternative - tester manuellement des choses, refixer des bogues qui régressent, ne pas pouvoir dire en quelques secondes que votre code fonctionne - coûte beaucoup plus cher.

Frank Shearar
la source
2
Je pense que c'est l'un des points les plus importants à dire aux opposants qui prétendent que le TDD est une perte de temps et des frais généraux inutiles. Ce n'est pas que TDD ne coûte pas de temps. C'est le fait que c'est un investissement qui évite des coûts futurs qui sont des ordres de grandeur plus importants
sara
2

Eh bien, le test est un fardeau, mais c'est un bon fardeau à porter. Il est préférable de faire un travail en amont, ce qui permettrait de gagner beaucoup de temps en cas de problème de production ou lors de la migration. Je voudrai toujours passer un test même si c'est peu de fardeau, mais je veux porter ce fardeau.

Rachel
la source