67 votes

Le message JUnit doit-il indiquer la condition de succès ou d'échec ?

Je peux écrire un message d'assertion de deux façons. En déclarant le succès :

assertEquals( "objects should be identical", expected, actual );

Ou en énonçant la condition d'être brisé :

assertEquals( "objects aren't identical", expected, actual );

Existe-t-il un standard pour cela dans JUnit spécifiquement ? Si non, quels sont les arguments de chaque partie ?

P.S. J'ai vu des articles sur le web qui démontrent ces deux choses sans explication, donc dire simplement "cherchez sur Google" n'est pas une réponse !

[MISE À JOUR]

Tout le monde s'accroche au fait que j'ai utilisé assertEquals et donc le message est probablement inutile. Mais bien sûr, c'est juste parce que je voulais illustrer la question simplement.

Alors imaginez plutôt que c'est :

assertTrue( ... big long multi-line expression ... );

Où un message est utile.

1 votes

À ce moment-là, comme l'ont dit diverses réponses, cela n'a plus d'importance. Le site uniquement L'important est de savoir si le message est informatif. Si c'est le cas, c'est parfait - le travail est fait. Vous pouvez tout à fait adopter vos propres conventions, mais dans ce cas, je ne pense pas que cela ait beaucoup d'importance, tant que le message est clair.

31voto

Jon Skeet Points 692016

Je prends rarement la peine d'envoyer un message, au moins pour assertEquals . N'importe quel exécuteur de test sensé vous expliquera que vous utilisiez assertEquals et les deux choses qui devaient être égales. Aucun de vos messages ne donne plus d'informations que cela.

J'ai l'habitude de constater que les échecs des tests unitaires sont transitoires - je trouve rapidement ce qui ne va pas et je le répare. La "découverte de ce qui ne va pas" implique généralement suffisamment de détails pour qu'un seul message ne fasse pas une grande différence. Considérez le "temps économisé par la présence d'un message" par rapport au "temps passé à penser à des messages" :)

Ok, un cas où je pourrait utiliser un message : lorsqu'il existe une description compacte en texte qui n'est pas évidente à partir de la représentation en chaîne de l'objet.

Par exemple : "La date attendue est le 1er décembre" lors de la comparaison de dates stockées en millisecondes.

Je ne m'inquiéterais pas de la façon dont vous l'exprimez exactement : assurez-vous simplement que le message indique clairement ce que vous voulez dire. Que ce soit "devrait être" ou "n'était pas", ça va - "1er décembre" ne serait pas évident.

5 votes

Je suis plutôt d'accord, mais vous ne répondez pas à la question. Lorsque un message a du sens - et c'est parfois le cas - comment le formuler ? Je pose une question sur la définition de l'API, donc dire "N'utilisez pas l'API" n'est pas une réponse.

0 votes

Vous le demandez dans un cas où l'API n'est généralement pas utile. Je vais quand même éditer...

2 votes

Voici un exemple de message ajouté à l'échec de l'assertion - assertEquals("Valeur de roulement non nulle lorsqu'il n'y a pas de couverture existante.", new BigDecimal("0.00"), hedgeValue.getRoll()) - il indique à quiconque voit l'échec de l'assertion, pourquoi vous vous attendiez à ce que les 2 valeurs soient égales.

24voto

Reto Gmür Points 148

Selon l'API de Junit, le message est "le message d'identification de l'AssertionError". Il ne s'agit donc pas d'un message décrivant la condition qui doit être remplie, mais d'un message décrivant ce qui ne va pas si la condition n'est pas remplie. Ainsi, dans votre exemple, "les objets ne sont pas identiques" semble être plus conforme.

1 votes

11voto

Matt Accola Points 1163

Contrairement à beaucoup d'autres, je pense que l'utilisation d'un message est extrêmement utile pour de nombreuses raisons :

  1. La personne qui consulte les journaux d'un test raté n'est pas forcément celle qui a rédigé le test. Cela peut prendre du temps de lire le code et de comprendre quel cas l'assertion est censée traiter. Un message utile permet de gagner du temps.

  2. Même dans le cas où c'est le développeur du test qui consulte les journaux, il se peut que des jours ou des mois se soient écoulés depuis que le test a été écrit et, là encore, un message peut faire gagner du temps.

Mon conseil serait de rédiger le message en indiquant le comportement attendu. Par exemple :

assertEquals("The method should be invoked 3 times", 3, invocationCount);

3voto

Uri Points 50687

Je pense que cela n'a aucune importance - Vous savez déjà qu'un échec s'est produit, et donc il importe peu que le message indique ce qui aurait dû se produire, ou ce qui ne devait pas se produire.

Le but du message est de vous aider quand il le peut, et non d'obtenir une certaine exhaustivité.

Évidemment, dans le cas de assertEquals, cela est moins important, mais le message est important dans le cas des assertions générales. Le message devrait vous aider à obtenir suffisamment de contexte pour comprendre immédiatement ce qui a échoué.

Cependant, la quantité de contexte nécessaire (et donc les détails dans le message) devrait dépendre de la façon dont vous obtenez le rapport. Par exemple, si vous le recevez dans Eclipse, vous pouvez facilement interagir et voir ce qui s'est passé, le message est donc moins important. Cependant, si vous recevez vos rapports par e-mail (par exemple, à partir d'un serveur de construction continue), vous voulez que le message fournisse suffisamment d'informations pour que vous ayez une idée de ce qui se passe avant même d'accéder au code source correspondant.

0 votes

Le message sera intégré aux rapports de test générés par la tâche JUnit Ant et j'ai généralement trouvé le contexte utile pour localiser le problème lorsqu'un test est défaillant.

3voto

guerda Points 7417

Je voudrais répondre à la question sans réfléchir, si un message en générique est utile.

Si un test échoue, quelque chose ne va pas. Je le sais. Je veux savoir pourquoi c'est cassé. C'est très facile à découvrir car il me suffit d'ouvrir le cas de test et le SUT. Comme Jon l'a dit, il est très facile de le réparer (espérons-le ;-) ).

Mais qu'en est-il du message ? Le message est pour moi un conseil, ce qui pourrait être fait pour le transformer en un cas de test vert. J'apprécierais donc qu'un conseil soit donné dans le texte du message, sur la manière de résoudre ce problème ou sur l'endroit où chercher le problème.

Un autre aspect intéressant serait l'utilisation d'expressions positives. Cela vaut la peine d'envisager d'utiliser des SMS positifs. Dans votre exemple, j'utiliserais Objects should be identical . Mais c'est une petite raison.

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