Combien de couverture de code est "suffisant"?

37

Nous commençons une campagne pour obtenir une couverture de code ici dans mon travail et cela m’a amené à penser ... Combien de couverture de code est suffisante?

Quand arrivez-vous au point de rendements décroissants sur la couverture de code? Quel est le bon compromis entre une bonne couverture et pas assez? Cela varie-t-il en fonction du type de projet que vous réalisez (c.-à-d. WPF, WCF, Mobile, ASP.NET)? (Ce sont des classes C # que nous écrivons.)

Vaccano
la source
Il n'y a vraiment pas de bonne réponse à cela; " Quelle est la couverture requise pour les tests unitaires? " Sur les forums de développeurs Artima propose des conseils utiles.
RN01

Réponses:

19

Nous visons au moins 70%. Sur les choses qui sont plus facilement testables (structures de données fonctionnelles, par exemple), nous visons 90% et la plupart des individus visent aussi près que possible de 100%. En ce qui concerne les éléments liés à WPF et les autres cadres très difficiles à tester, nous obtenons une couverture beaucoup plus faible (à peine 70%).

Noah Richards
la source
WPF est-il intrinsèquement difficile à tester, ou n'avez-vous pas encore déployé tous les efforts pour élaborer la meilleure stratégie pour obtenir une meilleure couverture?
JBRWilkinson
Cela tient en grande partie au fait qu'il est difficile de simuler l'entrée de WPF. Nos tests sont aussi uniformes ou API-y que nous pouvons l'obtenir, et l'incapacité de simuler facilement la couche qui se trouve "au-dessus" de WPF (entrée, au moins) rend difficile le test. Ce n'est pas un gros problème, car les parties de l'API non-graphiques sont faciles à tester, mais c'est juste le dernier tronçon qui va de notre modèle (ou modèle de vue) à WPF qui est un défi.
Noah Richards
1
Oui, WPF est une chienne à tester. Et je pourrais vivre avec cela s'il y avait une vérification du temps de compilation pour les liaisons dans les vues. Ainsi, au moins, la construction serait interrompue si vous modifiiez une propriété à laquelle la vue est liée. Mais ce n'est pas le cas. Cela nous a amenés à utiliser l’automation graphique dans nos tests d’acceptation, ce qui est également une chienne à écrire. Mais au moins cela nous donne confiance que le système fonctionne.
Pete
J'aime le nombre (70%). Au fur et à mesure que mes équipes grandissent, j'ai tendance à commencer à trouver des tests de couverture plutôt que de valeur. En ce qui concerne le commentaire WPF, nous ne sommes que dans les premiers jours. En d'autres termes, nous ne construisons / structurons pas le code WPF pour qu'il soit facilement testable. Les modèles simulés aident. Lors de la conception du code, concevez-le pour pouvoir être testé. Et, oui, à ce stade, les exemples sont limités, vous devrez donc y réfléchir. Ce n’est pas différent de la situation actuelle de la plupart des développeurs puisque TDD leur a été présenté pour la première fois avec un peu moins d’expérience dans le secteur.
Jim Rush
pour être plus précis WPF est une chienne à l' unité test, si vous avez besoin une plus grande couverture pour une raison quelconque la meilleure façon de la couverture des classes WPF est des tests d'interface utilisateur codés / tests d'intégration
jk.
55

Je suis d'avis que la couverture de code à elle seule est une métrique médiocre. Il est facile de produire des tonnes de tests inutiles qui couvrent le code, mais ne vérifient pas correctement le résultat, ou ne testent pas les cas extrêmes, par exemple. Le code de couverture signifie simplement qu'il ne jette pas une exception, pas que c'est juste. Vous avez besoin de tests de qualité - la quantité n'est pas si importante.

Fishtoaster
la source
8
La couverture de code doit être l’un des résultats de vos tests automatisés effectués dans votre système de génération automatisé. Les tests qui ne vérifient pas la sortie ne valent presque rien. Une couverture inférieure au seuil indique de nouvelles fonctionnalités avec des tests nuls / insuffisants. Il ne devrait pas y avoir de quoi battre les gens, mais cela peut certainement signaler un code non testé.
JBRWilkinson
3
J'appuie ici JBRWilkinson, bien que ce ne soit pas un indicateur de code correct, la couverture de code peut être un indicateur d'un manque de tests. Vos tests unitaires peuvent également fournir d’autres métriques, telles que des mesures de performance, pour que vous ne soyez pas soudainement surpris lorsqu’une nouvelle version tombe en panne sur le serveur en raison d’une charge de travail inattendue.
Matthieu M.
4
Je pense que c'est un faux choix. Les tests de haute qualité qui ne touchent qu'une petite quantité de code sont de mauvaises mesures globales de la qualité, tout comme les "tests" qui touchent une grande quantité de code mais ne vérifient pas vraiment les résultats. En d'autres termes, imaginez un processus d'assurance de la qualité pour les voitures qui testait très soigneusement la roue avant du conducteur, mais aucune autre partie de la voiture. Ce serait mauvais de la même manière qu’un processus d’assurance qualité qui consistait en un type qui scrutait toute la voiture et qui disait «ouais, ça va bien.
Noah Richards
38

"Assez", c'est quand vous pouvez modifier votre code avec l'assurance de ne rien casser. Sur certains projets, cela pourrait être 10%, sur d'autres, cela pourrait être 95%.

Ce n'est presque jamais à 100%. Cependant, parfois, essayer d'obtenir une couverture de code à 100% peut être un excellent moyen de supprimer les éléments cruels de la base de codes. N'oubliez pas qu'il existe deux manières d'augmenter la couverture de code: rédigez davantage de tests ou supprimez du code. Si le code n'est pas couvert parce qu'il est difficile à tester, il y a de fortes chances pour que vous puissiez le simplifier ou le refactoriser pour le rendre plus facile. S'il est trop obscur pour prendre la peine de tester, il y a généralement de bonnes chances que rien d'autre dans le code ne l'utilise.

RevBingo
la source
24
"Testez jusqu'à ce que la peur tourne à l'ennui"
Brad Mace
2
Vote positif pour le commentaire sur la suppression du code. J'utilise des métriques de couverture de code pour cela tout le temps (dans VS, où il met en évidence les lignes qui ne sont pas couvertes).
Noah Richards le
Bonne citation @bemace
jayraynet
14

La couverture de code approche 100% de façon asymptotique. Par conséquent, les 5% restants représentent probablement plus d'effort que de valeur, car vous commencez à obtenir des rendements extrêmement faibles pour les efforts déployés.

Robert Harvey
la source
7

La couverture est un paramètre à surveiller, mais ce ne devrait pas être l'objectif ultime. J'ai vu (et certes écrit!) Beaucoup de code de couverture élevée - couverture à 100% (TDD, bien sûr), mais:

  • les bugs sont toujours présents
  • le design peut encore être médiocre
  • vous pouvez vraiment vous tuer en tirant pour une cible de couverture arbitraire - choisissez vos batailles: p

Il y a une entrée "The Way of Testivus" que je pense qu'il est approprié de faire référence ici :)

HY
la source
5

Seulement 20% de la plupart du code fonctionnera 80% du temps . Une analyse de la couverture de code n'est pas très utile si elle n'est pas associée à un graphe d'appels pour déterminer ce qui doit être testé le plus. Cela vous indique où sont susceptibles vos cas extrêmes. Vous pouvez proposer 100 tests uniquement pour les cas extrêmes, qui représentent moins de 5% du code réel.

Assurez-vous donc de couvrir 100% des 20% qui définissent les chemins critiques et au moins 50% du reste (selon le graphe d'appels). Cela devrait vous procurer une couverture totale (environ) de 70% à 75%, mais cela varie.

Ne perdez pas de temps à essayer d'obtenir une couverture totale de plus de 70% tout en laissant les cas critiques sans vérifications.

Tim Post
la source
Les outils de couverture de code ne génèrent-ils pas un graphe d'appels par définition?
JBRWilkinson
4

Utilisez la couverture comme guide pour indiquer les zones non testées. Plutôt que d'avoir un mandat de couverture, il est plus sage de comprendre la raison pour laquelle le code n'est pas couvert. Enregistrer une raison du manque est une bonne discipline qui permet d’équilibrer les risques.

Parfois, la raison n’est pas souhaitable «par exemple, il n’ya pas assez de temps», mais elle peut convenir à une version anticipée. Il est préférable de signaler les zones sur lesquelles revenir pour une augmentation de la couverture plus tard.

Je travaille sur un logiciel de vol critique dans lequel une couverture de 100% des déclarations est considérée comme appropriée pour des systèmes non critiques. Pour les systèmes plus critiques, nous vérifions la couverture des branches / décisions et utilisons un appel technique MC / DC qui n’est parfois pas assez strict.

Nous devons également nous assurer que nous avons également couvert le code objet.

C'est un équilibre entre le risque, dans notre cas très élevé, et le rapport qualité / prix. Un choix éclairé est nécessaire en fonction du risque de rater un bogue.

Mark Fisher
la source
3

Lorsque vous commencez à envisager des modifications susceptibles d'avoir une incidence sur les performances d'exécution, la sécurité, la flexibilité ou la facilité de maintenance afin de permettre une couverture accrue du code, il est temps de mettre fin à la quête d'une couverture accrue.

J'ai des projets où ce point est égal à 0% parce que la couverture est impossible à calculer sans nuire à la conception et à d'autres projets dans lesquels elle atteint 92%.

Les métriques de couverture de code ne sont utiles que pour indiquer si vous avez peut-être manqué certains tests. Ils ne vous disent rien sur la qualité de vos tests.

Facture
la source
2

Un logiciel essentiel nécessite une couverture de relevé de 100%.

Au début, cela n'a aucun sens. Tout le monde sait qu'une couverture de test complète ne signifie pas que le code est entièrement testé et qu'il n'est pas si difficile d'obtenir une couverture à 100% sans tester réellement l'application.

Néanmoins, une couverture à 100% est une limite inférieure: bien qu'une couverture à 100% ne soit pas la preuve d'un logiciel exempt de bogues, il est certain qu'avec une couverture moindre, le code n'est pas entièrement testé et c'est tout simplement inacceptable pour les logiciels critiques en espace.

mouviciel
la source
2

J'aime beaucoup la réponse de @ RevBingo, car il suggère que la lutte à 100% peut vous amener à nettoyer ou à supprimer le code inutilisé. Ce que je n'ai pas vu dans les autres réponses, c'est une idée du moment où vous avez besoin d'une couverture élevée ou non. J'ai pris un coup de poignard pour commencer ceci. Je pense que l'ajout de détails à un tableau comme celui-ci serait une tâche plus utile que de trouver un numéro de couverture de test qui convient à tous les codes.

100%

Pour une API publique, telle que les Collections java.util, qui n'est pas couplée à une base de données et ne renvoie pas le code HTML, je pense qu'une couverture à 100% est un objectif de départ noble, même si vous vous contentez de 90 à 95% pour des raisons de temps ou autre. contraintes. L'augmentation de la couverture de test une fois que vous avez terminé la fonctionnalité oblige à un niveau de contrôle plus détaillé que d'autres types de révision de code. Si votre API est populaire, les gens l'utiliseront, la sous-classeront, la désérialiseront, etc. d'une manière inattendue. Vous ne voulez pas que leur première expérience soit de trouver un bogue, ou de superviser la conception!

90%

Pour le code d'infrastructure d'entreprise, qui prend en charge des structures de données et renvoie des structures de données, l'objectif de 100% reste probablement un bon objectif de départ, mais si ce code n'est pas suffisamment public pour inviter à une utilisation abusive excessive, peut-être que 85% est toujours acceptable?

75%

Pour le code qui récupère et renvoie Strings, je pense que le test unitaire est beaucoup plus fragile, mais peut toujours être utile dans de nombreuses situations.

50% ou moins

Je déteste écrire des tests pour des fonctions qui renvoient du HTML car il est si fragile. Et si quelqu'un change le CSS, le JavaScript ou tout le blob de HTML et d'anglais que vous renvoyez n'a aucun sens pour les utilisateurs finaux humains? Si vous pouvez trouver une fonction qui utilise beaucoup de logique métier pour produire un peu de HTML, cela peut valoir le coup d’être testé. Mais la situation inverse ne vaut peut-être pas la peine d'être testée.

Près de 0%

Pour certains codes, la définition de "correct" est "a un sens pour l'utilisateur final". Vous pouvez effectuer des tests non traditionnels sur ce code, tels que la vérification grammaticale automatisée ou la validation HTML de la sortie. J'ai même mis en place des instructions grep pour les petites incohérences dont nous sommes souvent la proie au travail, comme dire «Connexion» lorsque le reste du système l'appelle «Connexion». Cet homme ne doit pas être strictement un test unitaire, mais un moyen utile de détecter les problèmes sans attendre un résultat spécifique.

En fin de compte cependant, seul un humain peut juger de ce qui est sensible à l'homme. Les tests unitaires ne peuvent pas vous aider là-bas. Parfois, il faut plusieurs humains pour en juger avec précision.

0% absolu

C'est une catégorie triste et je me sens moins comme une personne pour l'écrire. Mais dans tout projet suffisamment important, il y a des terriers de lapin qui peuvent aspirer des semaines-personnes sans fournir d'avantages commerciaux.

J'ai acheté un livre car il prétendait montrer comment simuler automatiquement des données pour tester Hibernate. Mais il n’a testé que les requêtes Hibernate HQL et SQL. Si vous devez utiliser beaucoup de HQL et de SQL, vous n’obtenez pas vraiment l’avantage d’Hibernate. Il existe une forme de base de données Hibernate en mémoire, mais je n’ai pas investi le temps nécessaire pour comprendre comment l’utiliser efficacement lors des tests. Si cela fonctionnait, je souhaiterais bénéficier d’une couverture de test élevée (50% à 100%) pour toute logique d’entreprise qui calcule des données en naviguant sur un graphe d’objets, ce qui oblige Hibernate à exécuter certaines requêtes. Ma capacité à tester ce code est proche de 0% pour le moment et c'est un problème. J'améliore donc la couverture des tests dans d'autres domaines du projet et essaie de préférer les fonctions pures à celles qui accèdent à la base de données, principalement parce qu'il est plus facile d'écrire des tests pour ces fonctions. Encore,

GlenPeterson
la source
1

Je pense que cela dépend de la partie de l'application que vous testez. Par exemple, pour la logique métier ou tout composant impliquant des transformations de données complexes, je viserais une couverture de 90% (aussi élevée que possible). J'ai souvent trouvé des bugs mineurs mais dangereux en testant le plus de code possible. Je préférerais trouver de tels bogues lors des tests que de les laisser se produire sur le site d’un client un an plus tard. En outre, une couverture de code élevée a pour avantage d'empêcher les personnes de modifier trop facilement le code de travail, car les tests doivent être adaptés en conséquence.

D'autre part, je pense qu'il existe des composants pour lesquels la couverture de code est moins adaptée. Par exemple, lors du test d’une interface graphique, il est très fastidieux d’écrire un test qui couvre tout le code qui est exécuté lorsque vous cliquez sur un bouton afin d’envoyer l’événement aux bons composants. Je pense que dans ce cas, il est beaucoup plus efficace d'utiliser l'approche traditionnelle consistant à effectuer un test manuel dans lequel il suffit de cliquer sur le bouton et d'observer le comportement du programme (la fenêtre de dialogue de droite s'ouvre-t-elle? L'outil sélectionné est-il sélectionné ?)

Giorgio
la source
0

Je n'ai pas cette opinion très élevée sur l'utilisation de la couverture de code pour savoir quand votre suite de tests dispose d'une couverture suffisante.

La raison principale en est que si vous avez un processus dans lequel vous écrivez d'abord du code, puis des tests, puis que vous examinez la couverture de code pour savoir où vous avez manqué un test, c'est votre processus qui doit être amélioré. Si vous faites du vrai TDD, vous avez une couverture de code 100% prête à l'emploi (certes, il y a quelques anecdotes que je ne teste pas). Mais si vous regardez la couverture de code pour savoir quoi tester, alors vous écrirez probablement les mauvais tests.

La seule chose que vous puissiez conclure de la couverture de code, c'est que s'il est trop bas, vous n'avez pas assez de tests. Mais s'il est élevé, rien ne garantit que vous avez tous les bons tests.

Pete
la source