2009-01-19 6 views
32

Il y a quelques jours, j'ai commencé à chercher un framework de test unitaire appelé check, et j'ai l'intention d'exécuter le test sur le code c sous Linux.Est-ce trop compliqué d'exécuter le test unitaire avec Valgrind?

maintenant vérifier et un code bien conçu et un code de test peut me aidera à vérifier que la fonctionnalité de base est correcte, je veux dire, il est assez facile de simplement regarder les variables et la réponse en arrière puis décider si une fonction est correcte ou non. Mais disons que je veux tester une structure de mémoire dynamique avec beaucoup de malloc et libre, et il se trouve que je peux mettre des données et récupérer les données correctes à nouveau. Mais cela ne prouve pas que je n'ai pas cassé un peu de mémoire dans le processus, disons que j'ai oublié de libérer la moitié de la mémoire et j'ai perdu les pointeurs (un memleak classique). Ce code passerait probablement la plupart des tests unitaires. Donc, maintenant pour la question: Est-ce une bonne idée d'exécuter le code de test unitaire entier avec Val.Ind. et de lui laisser détecter des problèmes de malloc/free? (Ou peut-être quelque chose comme compilez clôture électrique?)

Il se sent comme une bonne idée, mais je ne suis pas sûr de ce que je me ici ..... entrer dans

Merci Johan


Mise à jour: Merci Douglas et Jonathan, il semble que ce soit une bonne idée et quelque chose que je devrais continuer :-)

Mise à jour: Valgrind est un outil amusant, cependant les premiers memleaks que j'ai trouvé en faisant cela étaient dans le framework de test et pas mon propre code (assez marrant cependant). Donc, une astuce pour le reste est de vérifier que le cadre de test de l'unité que vous utilisez ne fuit pas, avant de tourner votre propre code à l'envers. Un cas de test vide était tout ce qui était nécessaire dans mon cas, depuis lors, rien que le cadre de test unitaire est en cours d'exécution.

Répondre

51

Nous le faisons certainement - il est beaucoup plus simple d'exécuter valgrind par rapport aux tests unitaires qu'avec le programme complet.

De plus, toutes les erreurs de mémoire sont localisées dans la zone de code testée par le test unitaire, ce qui facilite la réparation.

Plus de vérification que vous avez corrigé est plus facile - parce que vous exécutez le test de l'unité pas un test plus compliqué contre votre programme complet.

Si vous utilisez valgrind de façon automatisée vous voulez probablement --error-exitcode=<number> [default: 0]

Spécifie un code de sortie alternative à revenir si Valgrind rapporté des erreurs dans la course. Lorsque la valeur par défaut est définie sur zéro, la valeur de retour de Valgrind sera toujours la valeur de retour du processus étant simulée . Lorsqu'elle est définie sur une valeur non nulle , cette valeur est renvoyée à la place, si Valgrind détecte des erreurs.Ce est utile pour utiliser Valgrind comme partie d'une suite de tests automatisés, puisqu'il permet de détecter facilement les cas de test pour que Valgrind a signalé des erreurs, simplement en inspectant les codes de retour.

http://valgrind.org/docs/manual/manual-core.html#manual-core.erropts

+0

Il y a aussi '--xml = yes' et' --xml-file = ', ce qui facilite l'automatisation de la lecture des résultats. –

10

Comme l'a dit Douglas Leeder, il vaut bien exécuter vos tests unitaires avec un logiciel de diagnostic que vous pouvez mettre la main qui veillera à ce qu'elle ne fonctionne pas vraiment comme prévu. Cela inclut ne pas abuser de la mémoire, donc l'utilisation de valgrind est une bonne idée.

Vous voulez vraiment que vos tests unitaires prouvent que votre code fonctionne.

Vous n'avez pas besoin de les exécuter sous valgrind tout le temps - mais cela devrait être aussi trivial que possible de le faire, et vous devriez le faire périodiquement (par exemple après de gros changements).

Questions connexes