Dans une entreprise pour laquelle je travaillais auparavant, les dirigeants ont insisté sur le fait que la couverture du code avec les tests unitaires doit être de 99% ou plus. Cela a entraîné l'écriture de plus de tests que de code. Il nous a fallu littéralement 3 jours pour écrire des tests pour une seule classe qui ont pris une journée à mettre en œuvre.
En conséquence, cependant, j'ai beaucoup appris sur le TDD, les outils de test, les pratiques, etc.
Dans l'entreprise pour laquelle j'ai travaillé par la suite, les tests unitaires étaient une chose inconnue. C'était quelque chose que quelqu'un avait peut-être entendu auparavant. J'ai eu du mal à leur présenter le concept de test unitaire, mais sans effet.
Maintenant, en tant que travailleur indépendant, je me demande - combien de temps faut-il vraiment consacrer aux tests unitaires? Étant principalement développeur iPhone / Android, quelles parties du code devraient être couvertes par les tests?
Réponses:
La quantité de tests unitaires nécessaires dépend de plusieurs facteurs:
la source
Dans notre groupe de produits, nous visons une couverture de code de 50 à 70% pour les tests unitaires et une couverture de 90% + pour les tests unitaires et l'automatisation des tests combinés. Le temps typique consacré à l'écriture des tests unitaires est d'environ 1 jour pour chaque fonctionnalité nécessitant 3-4 jours de codage tête en bas. Mais cela peut varier avec de nombreux facteurs.
La couverture du code à 99% est excellente. Les tests unitaires sont excellents. Mais une couverture de code de 99% à partir des tests unitaires seuls? J'ai du mal à croire que vous pouvez obtenir autant de couverture grâce aux tests unitaires .
Pour le cas où vous avez passé 3 jours à écrire des tests pour une classe qui, autrement, mettait 1 jour à mettre en œuvre. Vous n'avez pas expliqué pourquoi cela a pris autant de temps ou partagé un code. D'après les spéculations, je suppose que vous n'écriviez pas vraiment un véritable test unitaire pour votre classe, mais que vous écriviez en fait automatisation des tests . Et il n'y a rien de mal à cela - tant que vous reconnaissez la différence entre les deux différents types de tests.
Mais vous avez dit que les trois jours de rédaction du test ne concernaient qu'une seule classe. Peut-être que la classe elle-même n'a pas été conçue pour les tests unitaires. La classe implémente-t-elle l'interface utilisateur? La mise en réseau? E / S de fichier? Si c'est le cas, vous pourriez avoir fini par écrire plus de code pour tester le runtime Java que votre logique métier qui interagit avec le runtime.
TDD vous fait réfléchir en termes d'interfaces et d'interfaces vers les dépendances. Cette classe unique qui implémente l'interface utilisateur, la mise en réseau et le fichier / io pour une seule fonctionnalité pourrait être mieux servie divisée en plusieurs classes - une pour la mise en réseau, une pour le fichier / io et l'interface utilisateur divisée en une conception de contrôleur de visionneuse de modèle. Ensuite, vous pouvez implémenter des tests appropriés pour chacun avec des objets simulés simples pour les dépendances. Bien sûr, tout cela prend plus de temps. Ainsi, plutôt que 1 jour pour coder et 3 jours pour écrire des tests, ce type de conception peut nécessiter 3 jours de codage et 1 jour de tests d'écriture. Mais le code sera bien mieux maintenable et réutilisable.
la source
Les tests unitaires portent leurs fruits au moment de la maintenance. Si vous prévoyez d'avoir une application longue durée, vous passerez plus de temps à maintenir que vous ne le pensez maintenant (si vous ne l'avez pas encore essayé, vous serez surpris de la durée de vie d'un projet réussi)
Ce que vous voulez, c'est que si vous modifiez accidentellement vos fonctionnalités, vos tests échouent afin que vous trouviez ces choses le plus rapidement possible. Les clients n'aiment pas beaucoup quand les fonctionnalités changent de façon inattendue.
la source
Si vous faites TDD, vous écrirez les tests en même temps que le code, en basculant entre eux toutes les quelques minutes (ou moins). Il n'y aura pas de temps distinct passé pour les tests. L'utilisation de TDD permet de savoir beaucoup plus facilement que votre couverture de test est solide.
Si vous effectuez des tests unitaires après coup, vous devez écrire les tests qui vous diront si le code est cassé en raison de modifications. Je ne compterais pas sur les mesures de couverture ici, mais j'irais en fonction des cas d'utilisation et des paramètres vers les interfaces publiques. Cela sera finalement basé sur votre bon goût et votre expérience.
la source
Si vous ne passez pas de temps sur les tests, vous passerez encore plus de temps à déboguer en code live.
Passez donc autant de temps que nécessaire aux tests, pour couvrir tout (ou 99% du code).
la source
Comme d'autres l'ont déjà noté, cela dépend en grande partie du type de logiciel. Le rapport de temps de test / développement de 3: 1 que vous mentionnez peut être un peu trop pour les projets moyens, mais peut être parfaitement OK pour les applications critiques et peut-être même trop peu pour un système vital.
Une couverture de test unitaire de 99 +% est de même peut-être trop à attendre dans le cas d'une application moyenne, mais trop peu pour un projet critique.
D'après mon expérience, étant donné qu'une partie importante du code de production est un code de gestion des erreurs, une couverture de 80 à 90% serait suffisante pour la plupart des applications, et cela pourrait nécessiter à peu près le même temps passé à écrire des tests unitaires que le code de production. (Là encore, si l'on travaille sérieusement à la mode TDD, les deux sont complètement entrelacés pour devenir pratiquement une seule tâche, donc on ne peut qu'évaluer le rapport réel.)
la source