Si les tests unitaires sont si bons, pourquoi n'y a-t-il pas plus d'entreprises qui le font? [fermé]

103

La première véritable société de logiciels dans laquelle j'ai travaillé était entièrement consacrée aux tests unitaires (NUnit). Je ne sais pas si nous étions de vrais persévérants à l'époque - je n'ai aucune idée de la couverture de notre code et j'écrivais la plupart des tests unitaires. Depuis, j'ai rencontré des entreprises qui font beaucoup de tests, mais c'est des tests de chaise: repose sur la présence d'une personne, a une faible répétabilité et de faibles chances d'attraper des bogues. L'autre attitude est: c'était quelque chose avec lequel ils voulaient se lancer «dans le futur»; essentiellement quand l'argent tombe du ciel.

Les tests unitaires me manquent - cela me facilite la vie. Mais je constate que lorsque je cherche un nouvel emploi, les tests unitaires sont soit quelque chose que les entreprises aimeraient «faire» à l'avenir, soit quelque chose qu'elles ne font pas du tout (euh, ça existe depuis un moment maintenant!). Je dirais que 60 à 75% des demandes d'emploi que j'ai examinées au cours des 2 dernières années n'ont pas du tout répertorié les tests unitaires. Je ne peux penser qu'à un ou deux qui avaient une expérience de test unitaire comme exigence (pour un poste de développeur de niveau intermédiaire).

La question est donc de savoir ce qui manque ? Je pense que cela rend les gens plus productifs, mais ce n'est qu'après avoir passé beaucoup de temps à le faire. N'existe-t-il pas de bonnes études sur les économies de coûts des tests unitaires? Est-ce le type d'entreprise que je regarde?

Edit: même si le titre est un peu l'avocat du diable, je me considère comme un partisan des tests unitaires.

jcollum
la source
Dans quel type de domaine travaillez-vous? J'ai toujours rencontré des tests unitaires, d'une complétude variable, partout où j'ai travaillé. Mais mon expérience réside dans l'imagerie médicale et industrielle, alors c'est peut-être pourquoi ...
Kena
11
Test de la chaise: la personne s'assoit dans la chaise, pilote l'application, signale les bogues.
jcollum
3
@Darknight devrait avoir 50k votes positifs pour son honnêteté. Allez, vieilles têtes, soyez branchés à l'heure d'aujourd'hui. Gardez cette merde de test unitaire dans les années 90 où elle appartient. La plus grosse perte de temps. C'est juste quelque chose à évoquer pour que vous puissiez paraître important, mais ne fait absolument rien dans la plupart des cas. Nous avons quelque chose qui s'appelle un IDE ces jours-ci, nous ne programmons plus par console ou dans le bloc-notes. Nous savons que notre code est correct car nous pouvons placer le curseur sur le texte et voir les valeurs. Continuez les tests unitaires dans le passé avec tous les autres anciens.
portfoliobuilder
1
@portfoliobuilder Oui, passer la souris sur les valeurs dans votre IDE aidera vraiment à améliorer la qualité du code. Parce que l'état sera toujours le même et que le code ne changera jamais. Droit dessus! Et bonne chance.
Franz D.
1
@portfoliobuilder - vous avez oublié / s
ocodo

Réponses:

112

D'après mon expérience, plusieurs facteurs sont impliqués:

  1. La direction ne comprend pas vraiment ce qu'est réellement le test unitaire, ni pourquoi il a une réelle valeur intrinsèque pour eux.
  2. La direction a tendance à se préoccuper davantage de la livraison rapide des produits et considère (à tort) que les tests unitaires sont contre-productifs pour atteindre cet objectif.
  3. Il y a une perception erronée selon laquelle les tests appartiennent uniquement à l'assurance qualité. Les développeurs sont des codeurs et ne peuvent pas écrire de tests.
  4. Il y a une idée fausse courante selon laquelle la direction devra dépenser de l'argent pour effectuer correctement les tests unitaires, malgré le fait que les outils sont disponibles gratuitement. (Il y a, bien sûr, le temps de montée en puissance du développeur à prendre en compte, mais ce n'est pas vraiment prohibitif.)
  5. La réponse de Will arrondira cette réponse: il est très difficile de déterminer la valeur du code de test (modifier jcollum)

Naturellement, il y a d'autres facteurs, mais ce sont exactement ce que j'ai rencontré jusqu'à présent.

Mike Hofer
la source
Oui, à peu près décrit ma gestion et nous n'avons aucun test.
Ty.
Et sa prise en charge dans certains langages populaires (C / C ++) est médiocre.
Martin Beckett
@mgb - CxxUnit fonctionne plutôt bien pour moi ...
Dominic Rodger
2
CxxTest est également très bon. En raison des mécanismes de réflexion médiocres en C ++, il semble que des «solutions» plus variées soient présentées; CxxTest nécessite une étape de pré-traitement dans le système de construction, alors que des outils comme TUT sont entièrement compatibles avec la compilation et le langage, mais difficiles à utiliser.
Tom
2
J'ai constaté que les utilisateurs de stackoverflow.com avaient tendance à blâmer la direction pour beaucoup de leurs problèmes comme ceux-ci. Lorsque j'ai interrogé mes amis réels sur leurs `` problèmes de gestion '', j'ai généralement constaté qu'ils n'avaient même jamais fait part de leurs préoccupations à la direction, qu'ils devaient moins se lancer dans une campagne pour changer les points de vue des gens. Au lieu de dire «la direction ne le fait pas ...», j'essaie de penser à des moyens d'aider la direction à voir mon point de vue et de la convaincre que ma position est correcte. Je pense que c'est un problème car les développeurs ne sont pas doués pour vendre des tests unitaires.
Brian Stinar le
87

1) C'est difficile
2) Cela prend du temps
3) Il est très difficile de déterminer la valeur du code de test

Le point 3 est collant. Les bons tests unitaires réduisent les bogues. Mais il en va de même pour un bon code de production. Comment déterminez-vous combien de bogues n'existent pas à cause de vos tests unitaires? Vous ne pouvez pas mesurer ce qui n'existe pas. Vous pouvez indiquer des études, mais elles ne correspondent pas bien à la feuille de calcul de votre responsable commercial.

Will
la source
11
"Les bons tests unitaires réduisent les bogues. Mais le bon code de production aussi." - De bons tests unitaires permettent d'améliorer le code de production. Même si le code est au début mauvais, mais que vous avez une bonne couverture de test, vous pouvez refactoriser le système en toute confiance jusqu'à ce que le code soit bon.
Esko Luontola le
1
Esko, en plus d'avoir une bonne couverture, vous devez également avoir de bons tests qui testent réellement quelque chose. Vous pourriez avoir une couverture de code à 100% et en fait très peu de tests
Jacob Adams
Excellente réponse! Vous avez dit la même chose que ma réponse en beaucoup moins de mots.
Wedge
2
Oui, les tests unitaires prennent du temps. Mais il en va de même pour la «correction aléatoire des bogues». Un développement propulsé par les tests a «toutes» les fonctionnalités «documentées» dans les tests. Si les tests sont verts, le produit fonctionne comme prévu (à l'exception des problèmes d'utilisabilité, etc.). Mon expérience est que le temps de développement total n'est presque pas du tout affecté. Vous passez plus de temps sur les choses et faites-les correctement la première fois plutôt qu'après avoir passé du temps à corriger des bogues.
Arve Systad
1
Non. Pour le même laps de temps, j'obtiens 3 à 4 fois plus de code / fonctionnalités de production avec le même nombre de bogues par fonctionnalité. Cela varie d'un développeur à l'autre, mais généralement les mauvais développeurs écrivent également de mauvais tests et font encore de nombreuses erreurs, de sorte que les tests unitaires n'améliorent pas la qualité de leur code - ne font que les ralentir. Les tests ne prouvent jamais l'absence de bogues uniquement leur présence au mieux.
KolA
71

Il est facile de rejeter tout le blâme sur la «gestion». Mais la direction vous dit-elle vraiment de ne pas faire de test unitaire?

La direction en général ne vous dit pas (et ne devrait probablement pas) vous dire comment faire votre travail, qu'il s'agisse de modularisation, de types de données abstraits, de modèles de conception ou de tests unitaires. Ce sont des outils du métier qu'un ingénieur logiciel compétent et performant applique, mais pas un mauvais ingénieur.

Je pense que la vraie réponse à votre question est: les tests unitaires sont vraiment difficiles et les étudiants en informatique ne sont pas formés pour cela.

C'est facile lorsque vous écrivez votre propre classe de chaînes. Lorsque vous testez un produit réel, vous rencontrez des défis dont personne ne vous a parlé dans les diapositives PowerPoint:

  • Interaction de l'utilisateur. La moitié de votre application est la logique de l'interface utilisateur. Comment le tester de manière automatisée, qui ne se décompose pas si vous déplacez un bouton?
  • Interaction avec des API et des frameworks externes. Si vous écrivez un pilote de noyau Windows, comment le testez-vous unitaire? Écrivez-vous des stubs pour chaque IRP et fonction du noyau que vous utilisez, créant ainsi une simulation du noyau du système d'exploitation?
  • Les communications réseau sont la chose du 21e siècle. Comment coordonnez-vous un test unitaire composé de plusieurs composants distribués?
  • Comment choisissez-vous de bons cas de test? Je vois souvent des gens essayer l'approche «faire des choses aléatoires dans une boucle de 1000 itérations et voir si ça casse». Lorsque vous faites cela, l'effort est plus élevé que les retours, des bogues importants sont manqués et les tests unitaires sont abandonnés.
  • Comment vérifiez-vous que les exigences de performance sont satisfaites?
  • La connaissance des modèles de test est rare: les stubs, les réponses standardisées, les tests de régression sont des concepts que la plupart des gens ne connaissent pas. Combien sur votre lieu de travail lisent réellement un livre sur les tests unitaires?

La seule chose que nous pouvons reprocher à la direction est que les spécifications des exigences contiennent rarement des exigences sur le niveau de qualité du livrable.

La prochaine fois que votre patron vous demandera de faire une estimation du temps, incluez le temps nécessaire pour rédiger un test unitaire et voyez ce qui se passe.

flodin
la source
2
Bonne idée. Mais n'appelez pas le temps de créer des tests unitaires séparément du temps de créer le code "produit"!
Jeff Kotula
3
La lecture de cette réponse m'a fait réaliser que, bien que je connaisse le concept et les bases des tests unitaires, je ne sais vraiment pas du tout comment le faire efficacement. Pouvez-vous recommander un bon livre sur le sujet?
Breton
1
Sur un pilote de noyau sur lequel j'ai travaillé, j'ai refactoré un tas de code dans une bibliothèque que j'ai liée dans un faisceau de test en mode utilisateur. Ce code particulier était indépendant de l'environnement, donc c'était assez simple. Je ne l'ai pas essayé, mais les IRP, comme les systèmes de fichiers et les bases de données, devraient être moquables.
George V.Reilly
1
Avec Bochs ou QEMU, il est possible d'écrire une simulation de votre périphérique pour que votre pilote de noyau puisse parler.
Zan Lynx
2
@floding, réponse fascinante. Je pense que je vais devoir aller lire un livre sur les tests unitaires.
Dan Rosenstark
28

La plupart des tests ne testent rien.
Vous écrivez une fonction fileopen () et un test unitaire qui échoue si le fichier n'existe pas et réussit si le fichier existe. Génial! Maintenant, avez-vous vérifié si cela fonctionne avec le nom de fichier en chinois BIG5? sur un partage NFS? sur vista avec le fichier sur une clé USB et UAC activé?

Le problème est que les tests unitaires sont écrits par le même programmeur qui a écrit la fonction, avec le même ensemble d'hypothèses et avec le même niveau de compétence. Pour vraiment fonctionner, les tests doivent être écrits par quelqu'un d'autre, uniquement sur les spécifications publiées sans qu'ils voient le code. - Dans la plupart des entreprises, le simple fait de recevoir des spécifications écrites serait une percée!

Les tests unitaires vérifient les erreurs dans le code des fonctions individuelles. Ils peuvent fonctionner pour les couches d'accès aux données, les bibliothèques mathématiques, etc. où les entrées / sorties sont bien connues et la structure interne est complexe, mais dans de nombreux cas, ce n'est qu'une perte de temps.
Ils échouent lorsque les erreurs sont dues à des interactions entre différentes parties de code ou avec le système d'exploitation et l'utilisateur. Des problèmes tels que des paramètres DPI haut / bas qui gâchent une boîte de dialogue ou un paramètre de langue étrangère permutant un «.» et ',' ne sont généralement pas trouvés.

Martin Beckett
la source
15
Je pense que cette réponse manque un peu la cible. Les tests unitaires et les tests fonctionnels ne sont pas et ne devraient pas être la même chose.
Wedge
5
Un élément qui vous manque, c'est que les tests unitaires ne sont pas qu'une chose unique. Si je découvre plus tard que je dois corriger un bogue avec fileopen () sur un partage NFS, alors je peux ajouter un test à ma suite de tests pour cela. Ensuite, lorsque je ferai plus de développement à l'avenir, je mets en place des tests de régression.
Paul Osborne
2
De nombreuses erreurs proviennent d'interactions en dehors du code auxquelles les programmeurs n'ont pas pensé et qui ne peuvent être trouvées en vérifiant simplement le code. Un problème d'interface graphique courant est celui des machines avec des paramètres DPI très élevés / faibles - vous pouvez tester la fonction de dialogue d'unité à votre guise, mais ne le remarquerez pas.
Martin Beckett
5
ce n'est pas la fonction d'un test unitaire cependant, et l'interaction entre les différentes parties du code est très testable unitaire et, en effet, si ces parties sont écrites par des équipes distinctes, les tests unitaires de votre code par rapport à une interface partagée et se moquant du composant de l'autre équipe sont bonnes pratiques.
Steven Evers
1
TDD gère le problème de test truqué du "programmeur qui a écrit le code puis écrit les tests" en vous faisant écrire les tests avant d'écrire le code.
Ophidian
15

Des études ont été effectuées sur le retour sur investissement des tests unitaires - voir cette question .

Dominic Rodger
la source
15

J'ai trouvé beaucoup de développeurs qui ne sont pas intéressés par les tests unitaires. Cela semble toujours être beaucoup de travail avec peu de gains lorsque vous commencez. Personne ne veut s'inscrire pour un travail supplémentaire et donc ils résistent. Une fois que les gens commencent, ils s'y tiennent généralement avec enthousiasme, mais les faire démarrer peut être difficile.

Steve Rowe
la source
12

Mis à part la question de l'adoption des tests unitaires, les tests unitaires ne valent pas toujours la peine, bien qu'en général je pense que c'est le cas, lorsqu'ils sont appliqués correctement. Il n'y a rien de spécial dans les tests unitaires qui les évite d'être vulnérables à une mauvaise construction.

Les tests unitaires ont des coûts (création, maintenance et exécution) et ne valent la peine que s'ils offrent des avantages plus importants que ces coûts. La création de tests est une compétence comme les autres, elle nécessite une expérience et des connaissances spécifiques pour réussir. Sans une expérience suffisante, il est très facile, même pour les développeurs expérimentés, de créer des tests unitaires de faible qualité, de faible valeur et / ou de coût élevé qui ne valent pas la peine. D'autant plus qu'il peut être difficile de juger de la valeur d'un test unitaire.

De plus, les tests unitaires ne sont qu'un moyen d'améliorer la qualité du code, mais ce n'est pas le seul. Dans certaines circonstances et avec certaines équipes, ce n'est peut-être pas le moyen le plus efficace d'augmenter la qualité des logiciels.

Gardez à l'esprit que consacrer beaucoup d'efforts aux tests unitaires ne garantit pas la qualité des logiciels. De plus, il est possible de produire des logiciels de la plus haute qualité sans aucun test unitaire.

3 tours
la source
Ce que vous dites est vrai dans les langues à typage statique. Dans les langages à typage dynamique, ils sont absolument essentiels. Je veux dire que votre code est presque garanti d'être de la merde sans les tests. Je trouve que c'est en grande partie la raison pour laquelle certaines personnes semblent apprécier si fortement les tests unitaires.
Bill K
11

Eh bien, mon entreprise n'a pas opté pour le TDD ou les tests unitaires. Pour être honnête, nous ne savons pas comment le faire. Nous pouvons évidemment le faire pour des fonctions stupides comme CapitalizeString (), etc., mais nous ne savons pas comment le faire pour des systèmes très complexes avec des objets compliqués. De plus, la plupart des personnes interrogées n'ont aucune expérience ou une expérience limitée. Il semble que les tests unitaires soient importants par rapport à la foule SO, mais pas particulièrement importants dans le pool de travail disponible.

Le TDD est un sujet distinct. Nous sommes moralement opposés au TDD. Nous ne sommes pas des codeurs de cow-boy, mais nous pensons que cela freine la créativité et la flexibilité d'un projet. De plus, avoir le codeur qui a écrit la fonction de test unitaire n'a aucun sens. Quand je fais quelque chose, je code sur tous les cas extrêmes auxquels je peux penser. Ce dont j'ai besoin, c'est d'un autre cerveau pour rechercher des choses que j'ai pu manquer. Nous n'avons pas ça. Les équipes sont petites et autonomes.

Bref, nous ne croyons pas au TDD, mais nous aimerions faire un test unitaire. Nous n'avons tout simplement pas l'expérience pour le faire et nous ne pouvons pas le trouver facilement.

Steve
la source
1
À l'époque où je travaille, il y avait suffisamment de codeurs pour cela, nous faisions de la programmation par paires. J'ai trouvé très efficace pour l'un d'écrire des tests comme l'autre codé. Cela a également conduit à des questions très intelligentes sur le code.
Zan Lynx le
4
Le point de TDD, qui semble vous manquer, est que vous écrivez tous les cas extrêmes dans votre test unitaire. Pour chaque cas, vous écrivez une assertion dans votre test unitaire. Ensuite, si votre code réel échoue à une assertion, vous savez que votre code contient un bogue et que vous avez implémenté votre logique de manière incorrecte. Étant donné que les unités sont petites et que votre assertion teste le code spécifique de l'unité, il devrait être facile de localiser votre erreur logique. L'important est que vous écriviez d'abord vos affirmations. Ensuite, faites passer votre code. Pouvez-vous indiquer où ce processus freine autre chose que la croissance des bogues?
Christopher Parker
3
Il sera très difficile d'essayer de réaliser un test unitaire sans écrire d'abord les tests. C'est parce que votre code sera difficile à entrer dans un faisceau de test rétrospectivement. C'est l'un des principaux avantages du test en premier: la conception est testable dès le départ car les tests ont conduit la conception.
Alan Christensen
3
Comment se fait-il que vous ne soyez "pas sûr de savoir comment" effectuer un test unitaire, mais que vous croyiez que le TDD freine la créativité et la flexibilité?
jcorcoran
1
@Steve 6 ans plus tard, ce serait bien de savoir si vous avez déjà introduit le test unitaire (ou même le TDD) et si vous avez continué.
Luke Puplett
11

Il existe de nombreuses entreprises qui ne font vraiment rien dans le sens des meilleures pratiques. Pas de révision de code, pas de test unitaire, pas de plan de test, pas de rien, juste à côté du siège de leur pantalon.

Profitez-en pour leur faire utiliser une plateforme d'intégration continue et développer des tests unitaires! Un moyen facile d'impressionner les pouvoirs en place et d'augmenter la qualité et la stabilité de votre code en même temps

Edit: Quant à la raison, je pense qu'ils ne sont tout simplement pas au courant des outils actuels qui rendent les tests CI et unitaires extrêmement faciles.

Allen Rice
la source
Je suis généralement dans une position où je n'ai aucune influence sur des décisions politiques comme celles-ci; Je suis un sénateur subalterne en train d'être écarté par les présidents de comité.
jcollum
Il faut quelques minutes pour démarrer Hudson et écrire des tests unitaires. Si les tests unitaires sont déjà sur votre liste "TODO", alors vous faites juste votre travail. Les comités sont souvent impressionnés par des graphiques et des images fantaisistes, alors montrez-leur de jolis graphiques de tendance d'Hudson;)
Allen Rice
Ouais! Écoutons-le pour la vérité. Malgré tout le temps que nous consacrons aux développeurs à discuter des meilleures pratiques, ce n'est pas toujours utilisé dans le monde réel. Dommage vraiment.
NeedHack
Les médecins ne demandent pas s'ils doivent se laver les mains, n'est-ce pas?
ocodo
6

D'après ce que j'ai vu, de nombreuses entreprises ont d'énormes bases de code hautement couplées qui ne sont pas pratiquement testables à l'unité. Ils n'ont pas non plus d'exigences testables décentes, donc les tests unitaires seraient testés par rapport aux exigences de facto "as built".

Rob K
la source
Cela mérite plus de votes positifs. Code qui a été conçu selon le principe du "qu'est-ce que le design" / "Just do it !!" résultant en une grosse boule de boue n'aura aucune séparation / modularité (c.-à-d. unités ) donc il est résistant aux tests unitaires . L'un des avantages du premier test est que la modularité devient automatique. L'une des conséquences désastreuses de l'absence de tests est qu'il deviendra probablement impossible de tester le code à l'avenir.
ocodo
6

Je ne pense pas que la paresse soit la cause première des mauvais tests unitaires. Pour mon entreprise, les contraintes de temps et l'attitude «juste faire ça» sont les plus grands dissuasifs pour faire des tests unitaires. En outre, les endroits où nos systèmes échouent ont tendance à se situer davantage au niveau de l'intégration (services, accès aux bases de données, requêtes complexes qui nécessitent des données spécifiques pour les tests), et non au «niveau de l'unité». Ces choses sont simplement plus difficiles à tester, et si vous avez à peine le temps de faire la fonctionnalité, vous n'aurez probablement pas le temps de faire des tests utiles en même temps.

Andy White
la source
Ceci est courant. Je pense que l'argument est que si vous pensez que vous allez jamais le changer à l'avenir, vous devriez avoir un test qui s'assure qu'il fonctionne après qu'il change.
jcollum
6

Les tests unitaires doivent être une partie naturelle du flux de travail de développement de code, tout comme le compilateur.

Cependant, cela nécessite d'éduquer la direction sur les avantages des tests unitaires. Les développeurs juniors ont cependant des chances relativement faibles d'avoir une telle influence. Ainsi, si une entreprise est un partisan des tests unitaires dépend du fait qu'elle ait un développeur ou un architecte senior qui est un partisan des tests unitaires.

Je pense que c'est la réponse à votre question "ce qui manque et pourquoi les entreprises ne font-elles pas plus de tests unitaires" . :-)

Franci Penov
la source
1
+1 pour "devrait faire partie intégrante du flux de travail de développement de code". Chaque développeur professionnel devrait effectuer ses propres tests unitaires , quel que soit le processus officiel. Le seul argument légitime sur cette question est la définition d'une unité .
Dunk du
1
@Dunk Si vous ne définissez pas "unité", vous dites seulement que "les développeurs professionnels devraient faire leurs propres tests".
ChrisW
1
@ChrisW - Oui, les développeurs professionnels devraient faire leurs propres tests. Il n'y a aucune raison pour un développeur de rendre un code qu'il n'a pas testé suffisamment pour être sûr qu'il fonctionne correctement. Malheureusement, cela semble trop demander à de nombreux développeurs.
Dunk du
1
Quand je dis que la définition d'une unité est un argument légitime, je parle de la granularité d'une unité. Est-ce une classe? Est-ce une collection de classes? Est-ce un composant? Je pense que les tests unitaires au niveau de la classe (à quelques exceptions près) coûtent plus cher qu'ils n'en bénéficient et conduisent à de nombreux tests sans signification ...
Dunk
que d'autres ont souligné dans ce fil. Alors que si l'on définit une collection de classes qui fonctionnent ensemble comme une unité, vous pouvez toujours effectuer des tests automatisés et vos tests sont généralement plus significatifs car ils peuvent se concentrer davantage sur les fonctionnalités requises de niveau supérieur.
Dunk du
5

C'est probablement une combinaison de deux choses que vous avez déjà mentionnées. Il est difficile de mesurer les économies de coûts du TDD. Si vous souhaitez externaliser votre informatique, vous pouvez montrer combien vous payez par an pour les employés que vous avez par rapport au coût de la sous-traitance; c'est très concret. Comment dire, "Oh, ce test a détecté un bogue qui m'aurait pris 4 heures pour déboguer et corriger ..."?

Ovi Tisler
la source
Comment diable pouvez-vous deviner combien de temps un bogue prendrait pour déboguer et corriger. En général, le débogage est plus aléatoire que cela selon mon expérience - il se trouve que j'ai une idée du problème ou non.
Dominic Rodger
1
Oui, c'est pourquoi j'ai dit qu'il était si difficile de quantifier les avantages des tests.
Ovi Tisler le
5

La raison pour laquelle certains endroits ne l'utilisent pas est simplement parce qu'il faut beaucoup de travail à la fois pour démarrer et pour continuer. Le fait que l'écriture de tests unitaires prenne environ autant de temps que l'écriture de la fonctionnalité réelle semble à certains gestionnaires comme si vous réduisiez de moitié la productivité de votre développeur.

En plus de cela, vous créez une équipe (ou quelqu'un) a besoin de mettre l'infrastructure en place et de la maintenir.

Et comme le dit Alan , de nombreux endroits n'utilisent tout simplement pas les meilleures pratiques - ils veulent juste voir quelque chose de tangible.

Michael Burr
la source
5

Je pense que le programmeur doit simplement commencer à le faire. Quelques tests simples pour commencer sont faciles à justifier dans le cadre du développement.

Quelque chose comme un test unitaire est presque toujours nécessaire pour obtenir un débogage rapide. Expliquez simplement à quel point il est beaucoup plus rapide de lancer le test que d'organiser la bonne entrée, de définir un point d'arrêt du débogueur, de lancer l'application, etc.

Documentez le test dans votre code. Mettez simplement un commentaire expliquant où se trouve le test et comment l'exécuter. Les futurs programmeurs le verront et j'espère que les tests se répandront!

Zan Lynx
la source
4

Les tests unitaires sont l'un de ces termes de la boîte noire que la plupart des gens ont entendus, mais ne savent pas ce qui constitue exactement un test unitaire, par où commencer, comment les écrire, comment exécuter les tests, ce qu'ils devraient exactement tester, etc. . etc.

Dans de nombreux cas, il est plus facile pour le développeur incertain de simplement les rejeter comme inutiles ou comme un glaçage dont seuls les "développeurs au niveau de l'entreprise" ont besoin.

Soviut
la source
4

Je suis un grand fan des tests unitaires et je suis également partenaire dans une entreprise réalisant des projets de développement de contrats pour différents types de clients. Dans un mois, nous aborderons 3-4 projets différents de différentes tailles.

Si un projet semble être unique, je ne vais pas investir massivement dans les tests unitaires car ces tests unitaires ne sont pas rentables pour mon entreprise. Sur ces types de projets, je vais tester des éléments avec lesquels je ne suis pas sûr / que je ne suis pas familier ou qui pourraient changer fréquemment (comme un analyseur pour une source de données que je ne contrôle pas).

Alors que si je construis quelque chose dont je sais qu'il aura une longue durée de vie, est un travail plus important, avec lequel je travaillerai à travers plusieurs itérations, ou aura un impact important sur mes clients si une erreur se produit , Je vais investir dans plus de tests unitaires. Encore une fois, la priorité des tests tourne autour du code incertain / inconnu / changeant.

Je pense que les tests unitaires devraient tourner autour de la complexité d'une tâche, ainsi que de savoir s'ils vont porter leurs fruits. Il n'y a aucun sens à écrire du code supplémentaire qui ne sera pas utilisé.

Gavin Miller
la source
3

D'après mon expérience, cela dépend vraiment du logiciel que vous écrivez. J'ai trouvé qu'il était extrêmement difficile d'écrire des tests unitaires pour une interface utilisateur. Je n'utilise que des tests unitaires pour les parties du système qui ont une entrée / sortie définie.

Shaun Bowe
la source
Je suis d'accord. Si vous utilisez le modèle / la vue / le contrôleur, il est très judicieux de tester l'unité le modèle et le contrôleur. L'interface utilisateur est presque toujours mieux testée par un humain.
Zan Lynx le
Les tests de composants sont l'équivalent UI des tests unitaires. Il peut également y avoir des tests unitaires de «logique métier» utilisés par l'interface utilisateur. La logique métier dans ce sens est généralement une logique de présentation. Là où les tests d'interface utilisateur et les tests unitaires ne sont pas compatibles, c'est dans le domaine du rendu et du test de la sortie rendue. Par exemple, comment vais-je tester ce générateur de code QR ou ce graphique à secteurs? La réponse est, très certainement, vous n'allez pas tester cela unitaire. Le test d'instantané peut vous donner une valeur de test de régression dans ces cas.
ocodo
3

Les tests unitaires me manquent - cela me facilite la vie.

Ce n'est pas vraiment une raison suffisante pour qu'une entreprise adopte les tests unitaires.

Une raison suffisante pourrait être "meilleur marché" (et / ou "meilleur"): ce qui n'est pas aussi facile à prouver à propos des tests unitaires.

La seule bonne raison pourrait être «l'écriture de tests unitaires est la meilleure utilisation du temps des développeurs», ce qui est vraiment difficile à prouver IMO: et cela peut être vrai à certains endroits, pour certains logiciels, avec certains développeurs, et pas ailleurs.

Il y a beaucoup de développeurs qui ne pensent pas au monde des tests unitaires: y compris certains qui pensent que d'autres formes de tests (par exemple, l'intégration automatisée / les tests fonctionnels) peuvent être moins chères et plus précieuses, par exemple Suis-je le seul développeur à ne pas le faire? t comme les tests unitaires?

ChrisW
la source
3

Bien sûr, dans le monde idéal, vous ne pouvez pas vous opposer à un test unitaire.

Cependant, le fait d'écrire un test unitaire dépend d'un certain nombre de choses:

  • Comment le logiciel sera utilisé. Si vous écriviez un logiciel pour vous-même, écririez-vous des tests unitaires? Probablement pas. Si vous écriviez un logiciel pré-emballé destiné à être vendu dans le commerce, probablement oui.

  • Combien de personnes maintiennent le code ... si ce n'est que vous, alors vous le savez peut-être assez bien pour être suffisamment confiant après avoir apporté une modification pour qu'une lecture rapide du code soit suffisante pour vous assurer que rien n'est cassé. Si d'autres personnes qui n'ont pas initialement écrit le code doivent maintenant le maintenir, un test unitaire les aidera à être sûrs que lorsqu'ils mettent à jour le code pour corriger un gros problème (ce qui n'a évidemment pas été capturé dans le test unitaire!), Ils n'ont rien cassé .

  • complexité du code: uniquement le code de test qui nécessite un test. Une méthode d'attribution de variable en une ligne ne nécessite pas de test. Une méthode de 50 lignes avec plusieurs chemins d'exécution le fera probablement.

  • Considérations commerciales commerciales pratiques: le fait est que l'écriture de tests unitaires prend plus de temps que de ne pas le faire. Si vous écrivez un logiciel prototype, qui a un avenir commercial incertain, alors il y a un avantage à avoir entre avoir un code rapidement, maintenant, qui fonctionne suffisamment bien et avoir un code testé à l'unité en 2 semaines qui fonctionne mieux. Parfois, il est avantageux de savoir rapidement (appétit du consommateur) si le logiciel aura une courte étagère et passer au projet suivant.

et comme d'autres l'ont souligné, un test n'est aussi bon que la personne qui l'a écrit.

Joel
la source
3

La raison principale est que de nombreux développeurs et responsables de développement n'ont aucune idée de l'existence de tests unitaires ni de la manière de les utiliser.

La deuxième raison est que les tests unitaires ne peuvent être utilisés (de manière raisonnable) qu'avec du code qui répond déjà à certaines normes de qualité. Il y a de fortes chances que certaines bases de code existantes ne tombent pas dans cette catégorie.

La troisième raison est la paresse et / ou le bon marché.

Erich Kitzmueller
la source
3

Parce que les tests unitaires ne sont utiles que si vous écrivez du code testable. Et écrire du code testable est difficile. Et les gens sont paresseux et / ou bon marché.

EDIT: nuancé "paresseux" comme "paresseux et / ou bon marché"; dans de rares cas, les gens ont en fait les compétences, la capacité et la volonté de passer des tests, mais ils ont autre chose à faire qui affecte plus directement les résultats.

phtrivier
la source
Je voterais pour cela, sauf que je ne pense pas que les gens «sont paresseux». Pensez à la «programmation», c'est-à-dire que «votre langage de programmation populaire et les outils, documents, formations, flux de travail, trucs» n'a jamais été conçu de manière à faciliter l'écriture de code testable. Donc, pour écrire du code testable, vous devez toujours faire un effort supplémentaire. Pour aucune récompense «car cela fonctionne déjà» à ce stade (de sorte que l'écriture des tests d'abord, du code plus tard, TDD, a un sens pratique). Pensez qu'il s'agit davantage d'un biais cognitif qui trompe non seulement les programmeurs actuels, mais qui a déjà trompé les auteurs des outils de `` programmation '' sur lesquels les codeurs s'appuient maintenant.
n611x007
1
Oui, bien sûr, parfois les gens sont bon marché / fauchés / ont de meilleures choses à faire (ou comme nous le disons poliment "ont des compromis à faire.") Modifié pour refléter cela. (J'étais sur le point d'ajouter en plaisantant que, en plus, la plupart du code est inutile, donc le tester est également inutile; mais c'est juste un manque de sommeil;))
phtrivier
2

Je pense qu'une partie du problème est que les développeurs s'attendent à ce que les gens d'affaires aient le même ensemble de valeurs et qu'ils se soucient vraiment de la réponse à la question "Devrions-nous faire des tests unitaires ou pas?". Nous n'obtenons pas l'approbation préalable de l'entreprise pour utiliser un langage de haut niveau plutôt qu'un langage d'assemblage - c'est généralement le moyen le plus judicieux de faire le travail.

Le fait est que nous sommes les seuls qualifiés pour faire l'appel (ce qui ne veut pas dire que nous avons tous les mêmes connaissances sur le sujet). De plus, même si votre équipe ne fait pas, par politique, de tests unitaires (ou nommez-votre-méthode-du-jour), cela ne signifie généralement pas que vous ne pouvez pas le faire.

La vérité est que nous ne pouvons pas vraiment prouver le retour sur investissement de la plupart des choses que nous faisons avec une granularité trop fine. Pourquoi les tests unitaires sont tenus à la hauteur de cette norme de preuve déraisonnable / non typique me dépasse ...

Jeff Kotula
la source
Cependant, vous avez besoin de la gestion impliquée, car vous devez impliquer vos co-développeurs et la meilleure façon pour cela est que cela soit une exigence de haut en bas.
John
2

Les gens sont paresseux et n'adoptent le changement que lorsqu'ils y sont contraints.

Hunter
la source
2

Mes 2 cents:

  • Cela nécessite une certaine éducation et discipline, mais les nouveaux diplômés possèdent déjà les connaissances nécessaires.
  • La surcharge des tests peut être réduite avec de meilleurs outils et cela se produit également (refactoring, etc.)

Donc, ce n'est qu'une question de temps.

Il y a le débat Martin-Coplien dans lequel Bob Martin affirme que:

"de nos jours, il est irresponsable pour un développeur d'envoyer une ligne de code qu'il n'a pas exécutée dans un test unitaire."

[ http://www.infoq.com/interviews/coplien-martin-tdd]

robi-y
la source
2
Je ne crois pas à l'existence d'un système complexe et réel dans lequel chaque ligne de code était couverte par des tests unitaires.
quant_dev
2

Si vous souhaitez vendre tout le monde aux tests, procédez comme suit:

  1. Écrivez un tas de tests.
  2. Avertissez les autres développeurs qui changent de code et échouent à vos tests.
  3. Ils corrigeront leur code.
  4. Vous pouvez maintenant publier sans ces bogues particuliers.

Même un gestionnaire pourrait comprendre cela.

JeffO
la source
Les tests unitaires ne rendront pas votre version exempte de bogues. Cela peut réduire le nombre de bogues, mais il est extrêmement difficile de mesurer le nombre de bogues qui / n'ont pas / ont atteint la production à cause des tests.
Tom
Je ne sais pas si la direction serait contente que quelqu'un écrive un tas de tests alors qu'il pourrait coder de nouvelles fonctions. S'ils ne sont pas à bord de TDD, vous aurez probablement des problèmes pour écrire des tests pour couvrir du code que vous n'avez pas écrit.
jcollum
@jcollum Comme d'habitude, cela dépend du rapport coût / profit.
quant_dev
2

Les entreprises n'effectuent pas de tests unitaires, pour la même raison que de nombreux sites Web sont mal écrits - l'ignorance et les gens qui s'en tiennent à de vieilles habitudes. Dans mon entreprise, depuis que nous avons commencé les tests unitaires (avec Nunit et Typemock ), nous atteignons une couverture de code plus élevée et publions le logiciel dans un délai de commercialisation plus court.

Steve_0
la source
2

Comme la plupart des bonnes idées, l'adoption a plus à voir avec la dépendance du chemin organisationnel qu'avec la qualité de l'idée.

Dans la plupart des entreprises qui ont expédié des produits, une importante division QA a été créée avec un responsable QA de haut niveau. Les tests sont le fief de l'équipe QA.

Il est peu probable que l'équipe d'assurance qualité écrive du code de test unitaire, car l'entreprise ne dispose généralement pas de l'équipe d'assurance qualité avec ses codeurs robustes.

L'équipe de programmation hésite à écrire du code de test car cela crée un conflit avec l'équipe d'assurance qualité.

J'ai vu plus d'intérêt et l'adoption des tests unitaires dans des groupes où l'assurance qualité n'a pas été transformée en une fonction de travail distincte

zmanien
la source
1

L'écriture et la mise à jour des tests unitaires coûtent de l'argent. La plupart des logiciels précédents des entreprises n'ont pas de tests unitaires et coûteront trop cher à écrire. Donc, ils ne le font pas et cela ajoute du temps au processus de développement afin qu'ils ne l'ajoutent pas non plus aux nouvelles fonctionnalités.

David Basarab
la source
Vous devriez lire les liens sur le retour sur investissement.
jcollum
1

La plupart des entreprises sont inutiles. Pas celui pour lequel vous (ou moi) travaillons, évidemment.

Roger Lipscombe
la source
Cela ne répond pas à la question. Pour critiquer ou demander des éclaircissements à un auteur, laissez un commentaire sous sa publication.
AlexVogel
Q: "Pourquoi les entreprises ne font-elles pas plus de [tests unitaires]?" R: "Parce que la plupart des entreprises sont inutiles." Cela me semble être une réponse ...
Roger Lipscombe