154 votes

Peut tests unitaires être ajouté avec succès dans un projet de production? Si oui, comment et est-il utile?

Je suis fortement envisager l'ajout de tests unitaires à un projet existant qui est en production. Il a été lancé il y a 18 mois avant que je puisse vraiment voir toute prestation de TDD (face à la paume), alors maintenant, c'est une assez grande solution avec un certain nombre de projets et je n'ai pas la moindre idée de par où commencer à ajouter des tests unitaires. Qu'est ce qui m'considère que c'est que de temps en temps un vieux bug semble refaire surface, ou un bug est vérifié dans le fixe, sans vraiment en cours de correction. Unité de test permettrait de réduire ou d'empêcher ces problèmes de se produire.

Par la lecture de semblables questions, j'ai vu des recommandations, telles que le démarrage sur le bug tracker et la rédaction d'un cas de test pour chaque bug pour éviter la régression. Cependant, je crains que je vais à côté de l'essentiel et à la fin de manque fondamental tests qui aurait été inclus si j'avais utilisé TDD de l'aller.

Il n'existe aucun processus/étapes qui doivent être respectées afin de s'assurer que les solutions existantes est correctement unité testé et pas seulement bodged? Comment puis-je m'assurer que les tests sont de bonne qualité et ne sont pas simplement un cas de test est mieux que pas de tests.

Donc je suppose que ce que je me demande aussi est;

  • Est-il en vaut la peine pour un solution existante qui est dans la production?
  • Serait-il mieux ignorer le test pour ce projet, et ajouter dans une l'avenir possible de ré-écrire?
  • Ce sera plus bénéfique; les dépenses quelques semaines l'ajout de tests ou de quelques semaines l'ajout d'une fonctionnalité?

(Évidemment, la réponse à la troisième remarque est totalement dépendant, que vous parliez à la direction ou à un développeur)


Raison pour Bounty

L'ajout d'une prime d'essayer et d'attirer un plus large éventail de réponses qui ne font que confirmer mes soupçons que c'est une bonne chose à faire, mais aussi quelques bonnes raisons contre.

Je vise à l'écriture de cette question plus tard, avec les avantages et les inconvénients de l'essayer et de l'exposition qu'il vaut le coup de passer des heures sur le déplacement du développement futur du produit à l'ATS. Je veux relever ce défi et de développer mon raisonnement sans mon propre point de vue biaisé.

196voto

Mahol25 Points 1330

J'ai introduit des tests unitaires pour des bases de code qui n'en avaient pas auparavant. Le dernier gros projet, j'ai participé à où j'ai fait ce que le produit était déjà en production avec zéro tests unitaires quand je suis arrivé à l'équipe. Quand j'ai quitté - 2 ans plus tard - nous avons eu plus de 4500 ou alors des tests de rendement de près de 33 % de couverture de code dans une base de code avec 230 000 + production LOC (temps réel financiers Win-Formes d'application). Cela peut paraître faible, mais le résultat a été une amélioration significative dans la qualité du code et un taux de défaut plus d'une amélioration du moral et de la rentabilité.

Il peut être fait lorsque vous avez à la fois une compréhension exacte et de l'engagement des parties concernées.

Tout d'abord, il est important de comprendre que le test unitaire est une compétence en soi. Vous pouvez être très productif pour le programmeur par les "classiques" des normes et encore de la difficulté à écrire des tests unitaires d'une manière qui évolue dans un projet plus vaste.

Aussi, et spécialement pour votre situation, l'ajout de tests unitaires à une base de code qui n'a pas de tests est également une compétence spécialisée en lui-même. À moins que vous ou quelqu'un dans votre équipe a une expérience réussie avec l'introduction de tests unitaires pour un code de base, je dirais que la lecture de la Plume du livre est une obligation (pas obligatoire ou fortement recommandé).

Faire la transition avec les tests unitaires, votre code est un investissement dans les personnes et les compétences, tout autant que dans la qualité de la base de code. Cette compréhension est très importante en termes de mentalité et de la gestion des attentes.

Maintenant, pour vos commentaires et questions:

Cependant, je crains que je vais à côté de l'essentiel et à la fin de manque fondamental tests qui aurait été inclus si j'avais utilisé TDD de l'aller.

Réponse courte: Oui, vous manquez de tests et oui, ils n'ont peut d'abord ressembler à ce qu'ils auraient dans un champ vert de la situation.

Niveau plus profond réponse est celle-ci: Il n'a pas d'importance. Vous commencez avec pas de tests. Commencer à ajouter des tests, et refactoriser comme vous allez. Comme les niveaux de compétence pour aller mieux, commencer à hausser la barre pour tous les code nouvellement écrit ajouté à votre projet. Continuer à améliorer etc...

Maintenant, en lisant entre les lignes ici, j'ai l'impression que cela vient de la mentalité de la "perfection comme une excuse pour ne pas agir". Un meilleur état d'esprit est de se concentrer sur l'auto-confiance. Donc, comme vous pouvez pas savoir comment le faire encore, vous allez comprendre comment comme vous allez, et de remplir les blancs. Par conséquent, il n'y a aucune raison de s'inquiéter.

De nouveau, ses compétences. Vous ne pouvez pas aller de zéro tests de TDD-la perfection dans un "processus" ou "étape par étape" cook book approche de façon linéaire. Il sera un processus. Vos attentes doit être de rendre progressive de progrès et d'amélioration. Il n'y a pas de pilule magique.

La bonne nouvelle est que la des mois (voire des années) passe, votre code va peu à peu commencer à devenir "bon" bien factorisé et bien testé le code.

Comme une note de côté. Vous trouverez que le principal obstacle à l'introduction de tests unitaires dans une ancienne base de code est le manque de cohésion et de l'excès de dépendances. Par conséquent, vous trouverez probablement la compétence la plus importante sera de savoir comment briser les dépendances existantes et de découplage de code, plutôt que d'écrire le réel de la part des tests eux-mêmes.

Il n'existe aucun processus/étapes qui doivent être respectées afin de s'assurer que les solutions existantes est correctement unité testé et pas seulement bodged?

Sauf si vous l'avez déjà, configurer un serveur de build et mis en place une intégration continue de construire qui s'exécute sur chaque enregistrement, y compris tous les tests unitaires avec la couverture de code.

Former votre personnel.

Commencer quelque part et commencer à ajouter des tests pendant que vous faites des progrès de la perspective du client (voir ci-dessous).

Utilisation de la couverture de code comme une référence, de la façon dont beaucoup de votre code de production de base est en cours de test.

Le temps de construction doit toujours être RAPIDE. Si votre temps de construction est lente, votre unité de tests de compétences sont à la traîne. Trouver la lenteur de tests et de les améliorer (découplage de la production de code et test en isolation). Bien écrit, vous devriez facilement être en mesure d'avoir plusieurs milliers de tests unitaires et encore remplir un construire en moins de 10 minutes (~1-quelques ms / test est un bon, mais très à titre indicatif, quelques exceptions peuvent s'appliquer, comme le code à l'aide de réflexion, etc).

Inspecter et de s'adapter.

Comment puis-je m'assurer que les tests sont de bonne qualité et ne sont pas simplement un cas de test est mieux que pas de tests.

Votre propre jugement doit être votre principale source de la réalité. Il n'y a pas de métrique qui peut remplacer les compétences.

Si vous n'avez pas d'expérience ou d'un jugement, d'envisager d'engager quelqu'un qui ne.

Deux bruts indicateur secondaire total de la couverture de code et de construire la vitesse.

Est-il en vaut la peine pour une solution existante qui est dans la production?

Oui. La grande majorité de l'argent dépensé sur une coutume construit solution ou d'un système est passé après qu'il est mis en production. Et d'investir dans la qualité, des personnes et des compétences ne devrait jamais sortir de style.

Serait-il mieux ignorer le test de dépistage de ce projet et l'ajouter dans un futur possible de ré-écrire?

Vous devez prendre en considération, non seulement l'investissement dans les personnes et les compétences, mais plus important encore, le coût total de possession et la durée de vie prévue du système.

Ma réponse serait "oui bien sûr" dans la majorité des cas parce que je sais que je suis juste tellement mieux, mais je reconnais qu'il y a peut-être des exceptions.

Ce sera plus bénéfique; de passer quelques semaines à l'ajout de tests ou de quelques semaines, l'ajout d'une fonctionnalité?

Ni. Votre approche doit être à ajouter des tests à votre code de base TANDIS que vous faites des progrès en termes de fonctionnalité.

Encore une fois, c'est un investissement dans les personnes, les compétences ET la qualité de la base de code et en tant que tel, il aura besoin de temps. Les membres de l'équipe ont besoin d'apprendre comment briser dépendances, écrire des tests unitaires, d'apprendre de nouvelles habbits, améliorer la discipline et de sensibilisation à la qualité, à la façon de mieux les logiciels de conception, etc. Il est important de comprendre que lorsque vous commencez à ajouter des tests de membres de votre équipe probable n'est pas encore au niveau qu'ils doivent être en faveur de cette approche pour réussir, de sorte que l'arrêt de progression de passer tout le temps d'ajouter un grand nombre de tests ne fonctionnerait tout simplement pas.

En outre, l'ajout de tests unitaires pour un code de base de tout projet considérable de la taille est une GRANDE entreprise, qui exige l'engagement et la persévérance. Vous ne pouvez pas modifier quelque chose de fondamental, s'attendre à beaucoup de choses à apprendre sur la façon et demandez à votre parrain de ne pas attendre un quelconque retour sur investissement, par l'arrêt de la circulation de la valeur de l'entreprise. Qui ne volent pas, et franchement, il ne devrait pas.

Troisièmement, vous voulez inculquer son recentrage sur les activités les valeurs de votre équipe. La qualité ne vient jamais à la charge du client et vous ne pouvez pas aller vite sans qualité. Aussi, le client est vivre dans un monde en mutation, et votre tâche est de rendre plus facile pour lui de s'adapter. Client alignement nécessite à la fois de la qualité et de la circulation de la valeur de l'entreprise.

Ce que vous faites est de rembourser la dette technique. Et vous le faites bien que toujours au service de vos clients en constante évolution des besoins. Progressivement à mesure que la dette est payée, la situation s'améliore, et il est plus facile de mieux servir notre clientèle et d'offrir plus de valeur. Etc. Cette dynamique positive est ce que vous devriez viser pour car il souligne les principes de durable rythme et la volonté de maintenir et d'améliorer la morale, à la fois pour le développement de votre équipe, vos clients et vos partenaires.

Espère que ça aide

26voto

Donal Fellows Points 56559
  • Est-il en vaut la peine pour une solution existante qui est dans la production?

Oui!

  • Serait-il mieux ignorer le test de dépistage de ce projet et l'ajouter dans un futur possible de ré-écrire?

Non!

  • Ce sera plus bénéfique; de passer quelques semaines à l'ajout de tests ou de quelques semaines, l'ajout d'une fonctionnalité?

L'ajout de tests (en particulier les tests automatisés) le rend beaucoup plus facile de garder le projet de travail dans l'avenir, et il le fait beaucoup moins probable que vous allez expédier stupide problèmes à l'utilisateur.

Tests pour mettre dans les a priori sont ceux qui vérifier si ce que vous croyez à l'interface publique de votre code (et de chacun des modules en elle) travaille de la façon dont vous pensez. Si vous le pouvez, essayez aussi induire chaque isolés mode de défaillance de vos modules de code (notez que cela peut être non négligeable, et vous devez être prudent de ne pas cocher trop attentivement la façon dont les choses échouent, par exemple, vous n'avez pas vraiment envie de faire des choses comme compter le nombre de messages du journal produit en cas d'échec, puisque vérifier qu'il est connecté à tout, c'est assez).

Ensuite, mettre dans un test pour chaque bogue dans votre base de données de bogues qui induit exactement le bug et qui va passer lorsque le bug est corrigé. Ensuite corriger ces bugs! :-)

Ça coûte du temps pour ajouter des tests, mais vous êtes payé en retour de nombreuses fois de plus à la fin que votre code finit par être de bien meilleure qualité. Qui compte énormément lorsque vous êtes en train d'essayer de livrer une nouvelle version ou d'effectuer la maintenance.

17voto

fletcher Points 5739

Le problème avec la modernisation des tests unitaires est que vous allez réaliser vous de ne pas penser à l'injection de dépendance, ici ou à l'aide d'une interface, et avant longtemps, vous serez réécrire l'ensemble du composant. Si vous avez le temps de faire cela, vous allez construire vous-même un joli filet de sécurité, mais vous pourriez avoir introduit subtile bugs sur le chemin.

J'ai été impliqué dans de nombreux projets qui ont vraiment besoin de tests unitaires dès le premier jour, et il n'est pas facile à obtenir dans il y, court d'une réécriture complète, qui ne peut généralement pas être justifiée lorsque le code de travail et déjà faire de l'argent. Récemment, j'ai eu recours à l'écriture de scripts powershell que l'exercice le code d'une manière qui reproduit un défaut dès qu'il est soulevé, puis en gardant ces scripts comme une suite de tests de régression pour d'autres modifications en bas de la ligne. De cette façon, vous pouvez au moins commencer à mettre en place certains tests de l'application sans modifier trop, cependant, ils sont plus comme à la fin des tests de régression de bon tests unitaires.

14voto

haydenmuhl Points 1823

Je suis d'accord avec ce que la plupart des tout le monde l'a dit. L'ajout de tests de code existant est précieux. Je ne serai jamais en désaccord avec ce point, mais je voudrais ajouter une mise en garde.

Bien que l'ajout de tests de code existant est précieux, il a un coût. Il est au prix de ne pas construire de nouvelles fonctionnalités. Comment ces deux choses équilibre dépend entièrement sur le projet, et il y a un certain nombre de variables.

  • Combien de temps ça va vous prendre pour mettre tout ce code sous test? Jours? Semaines? Mois? Ans?
  • Qui êtes-vous l'écriture de ce code? Les clients payants? Un professeur? Un projet open source?
  • Quel est votre calendrier? Avez-vous des échéances fixes, vous devez répondre? Vous avez des délais à tous?

Encore une fois, permettez-moi d'insister, les tests sont précieux et vous devez travailler pour mettre votre ancien code sous test. C'est vraiment plus une question de comment vous vous en approchez. Si vous pouvez vous permettre de tout laisser tomber et de mettre tout votre ancien code en cours de test, de le faire. Si ce n'est pas réaliste, voici ce que vous devriez faire au moins

  • Tout nouveau code que vous écrivez doit être complètement sous l'unité de test
  • Tout ancien code il vous arrive de toucher (correction de bug, extension, etc.) devrait être mis sous test unitaire

Aussi, ce n'est pas tout ou rien la proposition. Si vous avez une équipe de, disons, quatre personnes, et vous pouvez répondre à vos délais en mettant une ou deux personnes sur les anciens tests de devoir, par tous les moyens de le faire.

Edit:

Je vise à l'écriture de cette question plus tard, avec les avantages et les inconvénients de l'essayer et de l'exposition qu'il vaut le coup de passer des heures sur le déplacement du développement futur du produit à l'ATS.

C'est comme demander "Quels sont les avantages et les inconvénients à l'aide de la source de contrôle?" ou "Quels sont les avantages et les inconvénients d'interroger les gens avant de les embaucher?" ou "Quels sont les avantages et les inconvénients de respirer?"

Parfois, il n'est que d'un côté de l'argument. Vous avez besoin d'avoir des tests automatisés et d'une certaine forme de tout projet, de toute complexité. Non, les tests n'écrivent pas eux-mêmes, et, oui, il faudra un peu plus de temps pour sortir les choses de la porte. Mais dans le long terme, il faudra plus de temps et coûter plus d'argent pour corriger les bugs après le fait que d'écrire les tests avant. Période. C'est tout là est à lui.

8voto

Hugh Brackett Points 2239

C'est absolument la peine. Notre application a complexe de la croix-des règles de validation, et nous avons récemment eu à faire apporter des changements importants aux règles. Nous nous sommes retrouvés avec des conflits qui empêchait l'utilisateur de l'épargne. J'ai réalisé qu'il prendrait une éternité pour faire le tri dans l'application reposant (il faut plusieurs minutes pour arriver au point où les problèmes ont été). Je voulais introduire des tests unitaires automatisés et si le cadre avait installé, mais je n'avais pas fait quelque chose au-delà d'un couple de mannequin de tests pour s'assurer que les choses se passaient. Avec les nouvelles règles d'affaires dans la main, j'ai commencé à écrire des tests. Les tests d'identifier rapidement les conditions qui ont causé des conflits, et nous avons été en mesure d'obtenir les règles clarifiées.

Si vous écrivez des tests qui couvrent les fonctionnalités que vous êtes en train d'ajouter ou de modifier, vous aurez un avantage immédiat. Si vous attendez pour un ré-écrire, vous avez peut-être jamais de tests automatisés.

Vous ne devriez pas passer beaucoup de temps à écrire des tests pour les choses qui fonctionnent déjà. La plupart du temps, vous n'avez pas de spécification pour le code existant, de sorte que la principale chose que vous faites des tests est votre reverse-engineering capacité. D'autre part, si vous voulez modifier quelque chose, vous avez besoin pour couvrir cette fonctionnalité avec des tests de sorte que vous saurez que vous avez fait les changements correctement. Et bien sûr, de nouvelles fonctionnalités, écrire des tests qui échouent, puis mettre en œuvre les fonctionnalités manquantes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X