33 votes

Est-il excessif d'exécuter le test unitaire avec Valgrind ?

Il y a quelques jours, j'ai commencé à me pencher sur un framework de test unitaire appelé check, et j'ai l'intention d'exécuter le test sur du code c sous Linux.

Maintenant, vérifiez et un code bien conçu et un code de test peuvent m'aider à vérifier. que la fonctionnalité de base est correcte, Je veux dire qu'il est assez facile de regarder les variables en entrée et la réponse en retour, puis de 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 de free, et qu'il s'avère que je peux y mettre des données et récupérer des données correctes. Mais cela ne prouve pas que je n'ai pas cassé de la mémoire au cours du processus, disons que j'ai oublié de libérer la moitié de la mémoire et que j'ai perdu les pointeurs (un memleak classique). Ce code passerait probablement la plupart des tests unitaires.

Passons maintenant à la question : est-ce une bonne idée d'exécuter l'ensemble du code de test unitaire avec, par exemple, Valgrind et de le laisser détecter les problèmes de malloc/free ? (Ou peut-être compiler dans quelque chose comme Electric Fence ?)

C'est une bonne idée, mais je ne sais pas trop dans quoi je m'embarque ici.....

Remerciements Johan


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

Mise à jour : Valgrind est un outil amusant, mais les premiers memleaks que j'ai trouvés en faisant ceci était dans le framework de test et non dans mon propre code (assez drôle cependant). Donc, un conseil pour les autres est de vérifier que le cadre de test unitaire que vous utilisez ne fuit pas, avant de mettre votre propre code à l'envers. Un scénario de test vide était tout ce dont j'avais besoin dans mon cas, depuis lors, rien d'autre que le cadre de test unitaire ne tourne.

53voto

Douglas Leeder Points 29986

C'est certainement le cas - il est beaucoup plus facile d'exécuter valgrind sur les tests unitaires que sur le programme complet.

En outre, les erreurs de mémoire sont localisées dans la partie du code testée par le test unitaire, ce qui facilite leur résolution.

De plus, il est plus facile de vérifier que vous avez corrigé le problème, car vous exécutez le test unitaire et non un test plus compliqué sur l'ensemble du programme.

Si vous exécutez valgrind de manière automatisée, vous voudrez probablement --error-exitcode=<number> [default: 0]

Spécifie un code de sortie alternatif à renvoyer si des erreurs lors de l'exécution. Lorsqu'il est défini à la valeur defa de Valgrind sera toujours la valeur de retour du valeur de retour du processus simulé. simulé. Si la valeur est différente de zéro, c'est cette valeur qui est renvoyée. [ ] si Valgrind détecte des erreurs. Cette valeur est utile pour utiliser Valgrind dans le cadre [ ] permet de détecter facilement les cas de test pour lesquels pour lesquels Valgrind a signalé des erreurs, simplement en inspectant les codes de retour.

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

10voto

Jonathan Leffler Points 299946

Comme l'a dit Douglas Leeder, il vaut la peine d'exécuter vos tests unitaires avec n'importe quel logiciel de diagnostic que vous pouvez vous procurer pour vous assurer qu'ils fonctionnent vraiment comme vous l'attendez. Il s'agit notamment de ne pas abuser de la mémoire, et l'utilisation de valgrind est donc une bonne idée.

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X