10
votes

Combien de tests unitaires est une bonne chose?

(aucune "question liée" semble clouer ceci, alors voilà.)

Je travaille sur le code de production. En discutant pour tout ce qui n'est pas visible pour l'utilisateur est difficile à faire, parfois. Si les ventes ne peuvent pas le voir, c'est un coût externe pour eux, et ils se disputeront contre elle à moins que la grande raison ne le soit pas.

Combien de test unitaire est une bonne chose? Si vous testez chaque classe, chaque méthode, votre version actuelle prendra plus de temps, éventuellement beaucoup plus longtemps. Si vous ne testez rien, la maintenance à l'avenir vous mènera plus longtemps, éventuellement beaucoup plus longtemps que les bugsfixes et les nouvelles fonctionnalités causent des problèmes que vous n'avez pas prévu et que les tests de l'unité auraient attrapé.

Comment trouvez-vous un équilibre sain et justifiable?

Edit: Pour répondre à quelques questions que les personnes raisonnables ont augmenté ...

  1. Les ventes ne sont pas en cours d'exécution, mais elles ont certainement une entrée et devraient avoir une entrée limitée dans un groupe. Ce sont eux qui paient les factures. S'ils dirigent complètement tout, ce serait déraisonnable, évidemment.

  2. Je suis certain qu'il n'y a pas de meilleure réponse, mais je suis curieux de savoir ce que les autres pensent est raisonnable. J'attends les deux extrêmes (tout! Rien!) Et beaucoup au milieu.

  3. Personne ne peut choisir son gestionnaire, et si une mauvaise politique sur les tests de l'unité est une décision de fabrication de marques dans une personne séjournant avec une entreprise / projet ... vous avez un lot plus d'options de carrière que la plupart d'entre nous, amis. :-)

    deuxième édition: "justifiable" est un mot important de là. Si je veux avoir du temps budgétisé / autorisé pour des tests unitaires et que je ne veux pas avoir à la faufiler, je vais devoir justifier la raison. La meilleure réponse en ce moment, pour moi, est "Test des choses qui ont été brisées auparavant", car je peux toujours justifier des politiques réactives.

    Des idées sur la manière de justifier quelque chose de proactif?


5 commentaires

Pourquoi "ventes" exécute-t-elle votre processus de développement de logiciels? Vous avez besoin d'un dirigeant / gestionnaire de développement qui comprend en réalité le développement de logiciels.


@Nate - Jon Skeet a une flexibilité pour choisir la haute direction qu'il aime. Certaines personnes ne sont pas si chanceuses :)


Ceci est un sujet controversé. Il n'y a vraiment aucune meilleure réponse car il y a des situations où les tests sont bénéfiques et qu'il existe des situations où il s'agit d'une perte de temps. La seule façon pour nous de produire une réponse acceptable dépend de la façon dont vous décrivez votre situation individuelle .


@DVK, même si, à un certain niveau, une personne de vente n'est pas assise sur votre épaule en vérifiant vos algorithmes et surveille votre script de construction, de la même manière, ils ne vérifieront pas si vous écrivez des tests d'unité, juste si vous êtes productif. Si vous n'avez pas de gestionnaire décent, cependant, vous ne ferez pas l'équipe.


Sur podcast n ° 41 de Stackoverflow Jeff et Joel discutent de la couverture TDD avec Oncle Bob Martin. Était un bon conseil. Lire La transcription ou Écouter le podcast . Je pense que ce sera vraiment utile pour tout le monde intéressé par cette question.


15 Réponses :


1
votes

Le test de l'unité automatisé apporte beaucoup à la table. Nous l'avons utilisé sur plusieurs projets. Si quelqu'un brise la construction, tout le monde sait immédiatement qui l'a fait et elle le réparait. Il est également intégré aux versions ultérieures de Visual Studio. Regarde dans

Développement piloté par tester

Cela devrait vous faire gagner beaucoup de temps et ne pas produire une quantité importante de frais généraux. J'espère que cela t'aides! Si oui, marquez-le.


1 commentaires

Nous sommes Java et utilisez Hudson toutes les heures pour tirer le code de la version de la version, exécutez la construction et des tests sur la construction et envoyez-nous un e-mail si quelque chose est asflu. C'est un super addition.



2
votes

imo, s'il y a suffisamment de donner à quelqu'un qui hérite du code une idée de sorte qu'ils puissent commencer à apporter des modifications, qu'il s'agisse de corriger des bogues ou de mettre en valeur, sans avoir à passer des jours à lire le code pour l'obtenir, c'est mon suggestion.

Ainsi, ne testez pas tout à mort, mais couvrez quelques cas courants et quelques cas de bord juste pour voir ce qui se passe si les choses ne vont pas comme étant disposées initialement.


0 commentaires

14
votes

Ceci, je pense, est une erreur:

Si vous testez chaque classe, chaque méthode, Votre version actuelle prendra plus de temps, Peut-être beaucoup plus longtemps.

Test - surtout test d'abord - améliore notre flux, nous garde dans la zone, nous accélère en réalité. Je suis au travail, parce que i test. Il ne faut pas tester cela qui nous ralentit.

Je ne teste pas les getters and Setters; Je pense que c'est inutile - surtout car ils sont générés automatiquement. Mais à peu près tout le reste - c'est ma pratique et mon conseil.


2 commentaires

+1. C'est une erreur d'effacement qui a trop trop de traction.


Entièrement convenu. Bien que les tests d'écriture puissent ralentir le code initial (comme dans, les premières centaines de lignes), je constate qu'il accélère tout et tout ce qui est passé.



5
votes

Qu'est-ce qui m'a été informé, c'est ceci:

  • essayer comme vous le pensez; Après un certain temps, évaluez-vous:
  • Si les tests dépensent plus de temps que ce que vous avez ressenti, il était raisonnable et que vous aviez trop peu de retour sur investissement, testez moins.
  • Si votre produit a été testé suffisamment et que vous avez perdu du temps, testez plus.
  • boucle au besoin.

    Un autre algorithme: -)

    • Certains tests sont vraiment faciles et vraiment utiles . Faites toujours cela, avec une haute priorité.
    • Certains tests sont vraiment difficiles à mettre en place et sont rarement utiles (par exemple, cela pourrait être dupliqué par des tests humains qui se produisent toujours dans votre processus). Arrêtez de faire cela, ça perd de votre temps.
    • entre les deux, essayez de trouver un équilibre , cela peut varier au fil du temps en fonction des phases de votre projet ...

      mis à jour pour le commentaire, à propos de prouver l'utilité de certains tests (ceux que vous croyez fermement):

      Je dis souvent à mes plus jeunes collègues que nous, des gens techniques (développeurs et autres), manque de communication avec notre gestion . Comme vous le dites, pour la gestion, les coûts qui ne sont pas répertoriés n'existent pas, ils ne peuvent donc pas qu'ils ne peuvent pas servir à justifier un autre coût. J'étais frustré à ce sujet aussi. Mais en pensant à cela, c'est l'essence même de leur travail. S'ils accepteraient des coûts inutiles sans justification, ils seraient des gestionnaires pauvres!

      Il ne s'agit pas de dire qu'ils ont raison de nous nier ces activités, que nous savons sont utiles. Mais nous doivent d'abord faire apparaître les coûts . Encore plus, si nous signalons le coût de manière appropriée, la direction devra prendre la décision que nous voulons (ou ce serait des gestionnaires de mauvais gestionnaires; notez que la décision peut toujours être priorisée ...). Donc, je suggère de suivre le coût afin qu'ils ne soient plus cachés:

      • à l'endroit où vous suivez le temps que vous dépensez, Remarque séparément les coûts qui proviennent du code non testé (si non disponibles dans l'outil, ajoutez-le sous forme de commentaire)
      • Agrégats COÛTS COÛTS sur un rapport dédié si l'outil ne le fait pas, de sorte que chaque semaine, votre responsable lit que x% de votre temps a été dépensé sur ce
      • Chaque fois que vous évaluez les charges, évaluez séparément plusieurs options, avec ou sans tests automatisés, montrant que les tests manuels ou les tests automatisés sont à peu près les mêmes (si vous vous limitez au plus utile (si vous vous limitez au plus utile. tests, comme expliqué plus tôt), tandis que ce dernier est un atout contre les régressions.
      • bugs de liaison au code d'origine . Si le lien n'est pas dans votre processus, trouvez un moyen de les connecter: vous devez montrer que le bug vient de ne pas avoir de tests automatiques.
      • accumule également un rapport de ces liens .

        Pour vraiment avoir un impact réellement sur le gestionnaire, vous pouvez les envoyer chaque semaine une feuille de calcul à jour (mais avec toute l'histoire, non seulement pour la semaine). Spreadsheet donne des graphismes qui donnent une compréhension immédiate et laissent le manager incroyable d'arriver aux chiffres bruts ...


1 commentaires

Le problème que j'ai prouve que dans un groupe extérieur; Jouer à l'oreille va bien, mais je dois justifier ma décision, et c'est difficile de mesurer "retour sur investissement", car je n'ai pas les résultats des choix que je n'ai pas pris.



5
votes

Commencez à créer des tests d'unités pour les domaines les plus problématiques (c.-à-d. Les sections de code qui rompent souvent et provoquent beaucoup de communication entre l'équipe de vente et les développeurs). Cela entraînera un impact immédiat et visible de l'équipe de vente et d'autres membres du personnel.

Puis une fois que vous avez de la crédibilité et que vous voyez la valeur, commencez à ajouter moins de zones problématiques jusqu'à ce que vous commenciez à noter que le ROI n'est plus là.

Bien sûr, la couverture complète est belle en théorie, mais dans la pratique, elle n'est souvent pas nécessaire. Sans parler trop coûteux.


0 commentaires

2
votes

Test suffisamment de temps afin que vous puissiez vous sentir à l'aise qu'un mauvais refacteur sera pris par les tests. Habituellement, c'est suffisamment pour tester la logique et le code de plomberie / câblage. Si vous avez du code qui est essentiellement getter / setters, pourquoi les tester?

Concernant l'opinion du gars des ventes que le test n'est pas nécessaire - Eh bien, s'ils savent beaucoup, pourquoi ne font pas le codage sanglant?


1 commentaires

J'ai dit la même chose aux ventes, mais honnêtement, ils ne vont pas «l'obtenir» à moins que je ne me pose de justification derrière cela. Cela dit, les ventes ont une incitation à court terme dans la plupart des organisations que j'étais. Les développeurs ont des incitations à long terme, généralement; Il n'y a pas de bonus de paiement pour obtenir une libération plus rapide, mais il y a toujours un bonus de devoir travailler moins difficile à long terme si vous le faites plus efficacement.



3
votes

Le "coût" est payé pendant le développement, lorsqu'il est beaucoup plus rentable, et le retour est réalisé pendant la maintenance continue, quand il est beaucoup plus difficile et coûteux de corriger des bugs.

Je fais généralement des tests unitaires sur des méthodes qui:

  • lire / écrire dans le magasin de données,
  • Effectuez la logique commerciale et
  • Valider l'entrée

    Puis, pour des méthodes plus complexes, je vais tester les tests. Pour des choses simples comme getter / setters, ou de simples trucs mathématiques, je ne teste pas.

    Pendant la maintenance, la plupart des rapports de bogues légitimes obtiennent un test d'unité, pour assurer que le bogue spécifique ne se reproduira plus.


0 commentaires

3
votes

Je crois toujours à ne pas être extrême. En particulier lorsque le temps et l'énergie sont limités. Vous ne pouvez tout simplement pas tout tester.

Tous les procédés / fonctions n'ont pas besoin d'un test d'unité. Ce qui suit pourrait avoir besoin. (1) Celui qui n'est clairement pas complexe, comme il suffit d'obtenir / set, une petite condition ou une boucle. (2) celui qui sera appelé par d'autres méthodes qui ont des tests d'unités.

Avec ces deux critères, je pense que vous pouvez réduire beaucoup de ceux-ci.

Juste une pensée.


1 commentaires

Vous TOUJOURS Croyez-vous pas d'être extrêmement extrême? Oh l'ironie!



15
votes

Deux suggestions pour des tests unitaires minimes qui fourniront le plus "bang pour le dollar":

Commencez par profiler votre application pour trouver les pièces les plus couramment utilisées - assurez-vous que ce sont des tests de l'unité. Continuez à vous déplacer vers le code moins couramment utilisé.

Lorsqu'un bogue est corrigé, écrivez un test d'unité qui l'aurait détecté.


1 commentaires

Je pourrais réellement pousser pour celui-ci; Lorsque nous trouvons un bug, le temps de budget non seulement pour le réparer, mais pour le tester afin que cela ne devienne plus un bug. Cela semble facile à argumenter; Cela pourrait être réactif au lieu de proactif, mais c'est un bon départ.



0
votes

Pour les tests d'unités, ma société a adopté une assez bonne stratégie: nous avons une application à plusieurs niveaux (couche de données, couche de service / objets métier, couche de présentation).

Notre couche de service est le seul moyen d'interagir avec la base de données (via des méthodes dans la couche de données).

Notre objectif est d'avoir au moins un test d'unité de base en place pour chaque méthode de la couche de service.

Cela a bien fonctionné pour nous - nous ne vérifions pas toujours complètement chaque chemin de code (en particulier dans des méthodes complexes), mais chaque méthode a le ou les chemins de code les plus courants vérifiés.

Nos objets ne sont pas testés de l'unité, à l'exception accidentelle via les tests de la couche de service. Ils ont également tendance à être des objets «muettes» - la plupart n'ont aucune méthode que celles requises (telles que des égaux () et GetHastCode ()).


2 commentaires

Des tests sur la couche de présentation?


Pas autre que manuel. Nous faisons des tests de fumée assez rigoureux sur chaque solution, cependant.



0
votes

Le but du test des développeurs est d'accélérer le développement des logiciels remplis d'un niveau de qualité acceptable.

qui conduit à deux mises en garde:

  1. Il est parfaitement possible de le faire mal, de sorte qu'il vous ralentit réellement. Donc, si vous trouvez que cela vous ralentit, c'est très probablement le cas que vous le faites mal.
  2. Votre définition de «qualité acceptable» peut différer de celle du marketing. En fin de compte, ils ont raison, ou du moins ont le dernier mot.

    logiciel qui fonctionne est un marché spécialisé, de niche, équivalent au matériel ingénierie haut de gamme fabriqué à partir de matériaux chers spécialisés. Si vous êtes à l'extérieur de ce marché, les clients n'attendront plus que votre logiciel fonctionne de manière fiable que de vous attendre à ce que leur chemise arrête une balle.


0 commentaires

0
votes

Combien de test unitaire est une bonne chose:

Les tests unitaires ne sont pas statiques qu'une fois que vous avez effectué et que votre travail est complet, il ira à travers la durée de vie du produit jusqu'à ce que vous n'arrêtez pas de nouveaux développements sur votre produit

essentiellement des tests unitaires doit être effectué à chaque fois: 1) vous faites une solution

2) nouvelle version

3) ou vous trouvez un nouveau problème

Je n'ai pas mentionné la période de développement, comme au cours de cette période, votre test de niveau de l'unité est évolué.

chose de base ici n'est pas la quantité (combien) mais la couverture de votre test d'unité

Par exemple: Pour votre application, vous faites un problème une fonction particulière x, vous faites un
Correction pour X, si aucun autre module n'est touché, vous pouvez faire des tests de l'unité
Applicable pour le module X, c'est maintenant le point de savoir combien de test de l'unité pour x
Couvrir

Donc, votre test de l'unité doit vérifier:

1) chaque interface

2) Toutes les opérations d'entrée / sortie

3) vérifications logiques

4) Résultats spécifiques à l'application


0 commentaires

0
votes

Je suggérerais de ramasser le livre L'art du test de l'unité . Le chapitre 8 couvre l'intégration des tests de l'unité dans votre organisation. Il y a une superbe table (p. 232) qui montre les résultats d'un essai à deux équipes (un utilisant des tests, un sans); L'équipe de test a rasé deux jours de réduction sur leur temps de libération global (y compris l'intégration, les tests et la fixation de bugs) et avait 1/6 les bugs trouvés dans la production. Le chapitre 9 traite des analyses de faisabilité des tests pour obtenir le plus bang-à-faire avec le code hérité.


1 commentaires

Si seulement pour les données empiriques, cela semble en valeur. Merci!



0
votes

S'il est possible de passer au-dessus du test (point de décomposition), il est difficile de le faire. Les tests (en particulier les tests tôt dans le processus) permettent de gagner du temps. Plus un défaut reste long dans un produit plus il coûte pour résoudre.

Testez souvent un test précoce et testez aussi complètement que pratique!


0 commentaires

0
votes

Bien que le test unitaire est utile, vous devez absolument avoir un plan de test système pour chaque version - ceci devrait inclure le test des cas d'utilisation normaux de votre application (pour la régression) et la fonctionnalité spécifique travaillant plus en profondeur.

Les tests de système automatisés sont à peu près essentiels pour éviter les régressions - les tests d'unité peuvent tous passer et votre application sera toujours un pot de bouse.

Mais si vous ne pouvez pas effectuer de tests de système automatisés pour tous vos cas d'utilisation (la plupart des applications ont des cas d'utilisation complexes, en particulier lorsqu'ils interagissent avec des systèmes de 3ème partie et des interfaces utilisateur), vous pouvez ensuite exécuter des tests système manuels.

Interfaces utilisateur Créez les principaux problèmes - la plupart des autres choses peuvent être automatisées relativement facilement. Il y a des tas d'outils pour tester automatiquement les interfaces utilisateur, mais ils sont notoirement fragiles, c'est-à-dire à chaque libération, les tests automatiques doivent être modifiés juste pour réussir (n'ayant pas de nouveaux bugs).


0 commentaires