2010-07-23 10 views
25

J'ai remarqué que même si j'ai beaucoup de doctests dans notre code Python, quand je trace les tests en utilisant les méthodes décrites ici:Assurer la couverture de code dans les tests unitaires?

traceit

je trouve qu'il ya certaines lignes de code qui sont jamais exécuté. Je passe actuellement en revue les logs de traceit pour identifier les blocs de code qui ne sont jamais exécutés, puis essaye de trouver différents cas de test pour exercer ces blocs particuliers. Comme vous pouvez l'imaginer, cela prend beaucoup de temps et je me demandais si nous n'allions pas dans le bon sens et si vous aviez tous d'autres conseils ou suggestions pour régler ce problème, ce qui, je suis sûr, doit être courant lorsque le logiciel devient suffisamment complexe.

Répondre

28

coverage.py est un outil très pratique. Entre autres, il fournit branch coverage.

+11

Cette réponse serait plus utile si vous fournissiez un court exemple d'utilisation de 'coverage.py'. – SimplyKnownAsG

+6

@SimplyKnownAsG La page liée a une section de démarrage rapide avant et centre, et comprend un exemple d'utilisation. Plutôt que de copier et coller de la documentation qui est susceptible de changer à mesure que de nouvelles versions sortent, je trouve qu'il vaut mieux simplement créer un lien. –

+1

Comment utiliser 'coverage.py': https://github.com/audreyr/how-to/blob/master/python/use_coverage_with_unittest.rst – dm295

18

Avez-vous un mandat de la direction pour être dogmatique sur l'obtention d'une couverture de code de 100% avec vos cas de test? Si non, croyez-vous que toucher chaque ligne de code est le moyen le plus efficace de trouver des bogues dans votre code? En supposant que vous n'avez pas de ressources en temps et en personnel, vous devriez probablement vous concentrer sur des tests raisonnables de tout votre code non trivial en mettant l'accent sur les parties que les développeurs savent difficiles à écrire ou sujettes aux erreurs.

Bien que la couverture de code soit excellente parce que vous ne pouvez certainement pas dire qu'un morceau de code est testé jusqu'à ce qu'il ait été touché, je n'équivaut pas à toucher un morceau de code pour l'appeler testé. Je ne suis pas contre la couverture de code, mais il est trop facile de tomber dans l'utilisation de la couverture de code comme indicateur pour savoir quand le test est terminé. Je pense que ce serait une erreur.

+7

Ceci est un excellent commentaire. Dans ma situation, nous avons des scientifiques, pas des programmeurs, qui écrivent le code Python. En conséquence, même si les scientifiques sont très intelligents, le code est très mal conçu. Cela signifie que l'intégration finale et les tests sont un cauchemar, et nous devons travailler trop dur pour découvrir des problèmes sérieux au cours de cette phase. J'essaie de les amener à écrire de meilleurs cas de test pour le code dont chacun est responsable et je prévois d'utiliser la couverture de code comme un moyen de qualifier les tests qu'ils intègrent. Je peux comprendre que pas 100% du code doit être touché, mais cela aiderait. – reckoner

+0

Avoir une couverture de 100% n'est pas une garantie de tests suffisants, mais le fait de ne pas l'avoir indique généralement qu'il n'y a pas suffisamment de tests. N'oublions pas non plus que le module de couverture permet des commentaires tels que «# pragma: no cover» et «# pragma: no branch». –