Mesure de la couverture du code dans Delphi
Est - il possible de mesurer la couverture de Code avec DUnit? Ou y a-t-il des outils gratuits pour accomplir cela? Qu'utilisez-vous pour cela? Quelle couverture de code optez-vous habituellement pour?
Jim McKeeth: Merci pour la réponse détaillée. Je parle de tests unitaires dans le sens d'une approche TDD, pas seulement de tests unitaires après un échec. Je suis intéressé par la couverture de code que je peux réaliser avec quelques tests unitaires préécrits de base.
6 réponses
Je viens de créer un nouveau projet open source sur Google Code avec un outil de couverture de code de base pour Delphi 2010. https://sourceforge.net/projects/delphicodecoverage/
En ce moment, il peut mesurer la couverture de ligne, mais je prévois d'ajouter une couverture de classe et de méthode aussi.
Il génère des rapports html avec un résumé ainsi qu'une source balisée vous montrant quelles lignes sont couvertes (vert), qui n'étaient pas (rouge) et le reste des lignes qui n'ont pas de code généré pour ils.
Mise à Jour: Depuis la version 0.3 de Delphi Code Coverage , Vous pouvez générer des rapports XML compatibles avec le plugin Hudson EMMA pour afficher les tendances de couverture de code dans Hudson.
Mise à Jour: La Version 0.5 apporte des corrections de bugs, une configurabilité accrue et des rapports nettoyés
Mise à Jour: La Version 1.0 apporte un support pour la sortie emma, la couverture des classes et des méthodes et la couverture des dll et BPLs
Je ne connais pas d'outils gratuits. AQTime est presque la norme de fait pour le profilage Delphi. Je ne l'ai pas utilisé, mais une recherche rapide trouvée Discover pour Delphi , qui est maintenant open source, mais ne fait que couvrir le code.
L'un ou l'autre de ces outils devrait vous donner une idée de la couverture de code de vos tests unitaires.
Faites-vous référence à la couverture de code à partir de tests unitaires ou de code périmé? En général, je pense que seul le code testable qui a un échec devrait être couvert par un test unitaire (Oui, je me rends compte que peut-être commencer une guerre sainte, mais c'est là que je me trouve). Donc, ce serait un pourcentage assez faible.
Maintenant, le code périmé d'un autre côté est une histoire différente. Le code périmé est un code qui ne s'utilise pas. Vous n'avez probablement pas besoin d'un outil pour vous le dire pour beaucoup de votre code, il suffit de chercher le Petit Bleu Points après avoir compilé en Delphi. Tout ce qui n'a pas de point bleu est vicié. Généralement si le code n'est pas utilisé, il doit être supprimé. Donc, ce serait une couverture de code à 100%.
Il existe d'autres scénarios pour le code périmé, comme si vous avez un code spécial à gérer si la date tombe le 31 février. Le compilateur ne sait pas que cela ne peut pas arriver, donc il le compile et lui donne un point bleu. Maintenant, vous pouvez écrire un test unitaire pour cela, et le tester et cela pourrait fonctionner, mais alors vous venez vous avez perdu votre temps une deuxième fois (d'abord pour écrire le code, ensuite pour le tester).
Il existe des outils pour suivre les chemins de code utilisés lorsque le programme s'exécute, mais ce n'est que simi-fiable car tous les chemins de code ne seront pas utilisés à chaque fois. Comme ce code spécial que vous devez gérer l'année bissextile, il ne fonctionnera que tous les quatre ans. Donc, si vous sortez alors votre programme sera brisé tous les quatre ans.
Je suppose que je n'ai pas vraiment répondu à votre question sur DUnit et le Code Couverture, mais je pense que je vous ai peut-être laissé avec plus de questions que vous avez commencé avec. Quel type de couverture de code recherchez-vous?
UPDATE: Si vous adoptez une approche TDD, aucun code n'est écrit jusqu'à ce que vous écriviez un test pour cela, donc par nature vous avez une couverture de test 100. Bien sûr, tout simplement parce que chaque méthode est exercée par un test ne signifie pas que toute sa gamme de comportements est exercée. SmartInspect fournit une méthode très facile pour mesurer qui les méthodes sont appelées avec le calendrier, etc. C'est un peu moins Qu'AQTime, mais pas gratuit. Avec un peu plus de travail de votre part, vous pouvez ajouter de l'instrumentation pour mesurer chaque chemin de code (branches des instructions "if", etc.) Bien sûr, vous pouvez également ajouter votre propre journalisation à vos méthodes pour obtenir un rapport de couverture, et c'est gratuit (Eh bien, attendez-vous à votre temps, ce qui vaut probablement plus que les outils). Si vous utilisez Jedi Debug, vous pouvez également obtenir une pile d'appels.
TDD ne peut vraiment pas facilement être appliqué rétroactivement au code existant sans beaucoup de refactoring. Bien que les nouveaux IDE Delphi aient la possibilité de générer des stubs de test unitaire pour chaque méthode publique, ce qui vous donne une couverture de 100% de vos méthodes publiques. Ce que vous mettez dans ces talons détermine l'efficacité de cette couverture.
J'utilise Découvrir pour Delphi et il fait le travail, pour les tests unitaires avec DUnit et les tests Fonctionnels avec TestComplete.
Découvrir peut être configuré pour fonctionner en ligne de commande pour l'automatisation. Comme dans:
Discover.exe Project.dpr -s -c -m
Découvrir fonctionne très bien pour moi. Il ralentit à peine votre application, contrairement à AQTime. Cela peut ne pas être un problème pour vous de toute façon, bien sûr. Je pense que les versions récentes D'AQTime fonctionnent mieux à cet égard.
J'utilise Discover " depuis des années, j'ai très bien travaillé JUSQU'à BDS2006 (qui était la dernière version pré-XE* de Delphi que j'ai utilisée et que j'utilise toujours), mais son état opensourced actuel, on ne sait pas comment le faire fonctionner avec les versions Xe * de Delphi. Une honte vraiment, parce que j'ai aimé cet outil, rapide et pratique dans presque tous les sens. Alors maintenant, je passe à Delphi-code-couverture...