web-dev-qa-db-fra.com

Java / JUnit - AssertTrue vs AssertFalse

Je suis assez nouveau dans Java et je suis le tutoriels du débutant pour Eclipse Total . Ils sont tous très utiles, mais dans la leçon 12, il utilise assertTrue pour un cas de test et assertFalse pour un autre. Voici le code:

// Check the book out to p1 (Thomas)
// Check to see that the book was successfully checked out to p1 (Thomas)
assertTrue("Book did not check out correctly", ml.checkOut(b1, p1));    // If checkOut fails, display message
assertEquals("Thomas", b1.getPerson().getName());

assertFalse("Book was already checked out", ml.checkOut(b1,p2));        // If checkOut fails, display message
assertEquals("Book was already checked out", m1.checkOut(b1,p2));

J'ai cherché une bonne documentation sur ces méthodes, mais je n'ai rien trouvé. Si ma compréhension est correcte, assertTrue ainsi que assertFalse affichent la chaîne lorsque le second paramètre est évalué à false. Si oui, quel est l'intérêt de les avoir tous les deux?

Edit: Je pense que je vois ce qui me déroutait. L’auteur a peut-être mis les deux dans juste pour montrer leurs fonctionnalités (il IS un tutoriel après tout)). Et il en a mis en place un qui échouerait, de sorte que le message moi POURQUOI cela a-t-il échoué?.

50
Thomas

assertTrue échouera si le deuxième paramètre est évalué à false (en d'autres termes, il garantit que la valeur est vraie). assertFalse fait le contraire.

assertTrue("This will succeed.", true);
assertTrue("This will fail!", false);

assertFalse("This will succeed.", false);
assertFalse("This will fail!", true);

Comme pour beaucoup d'autres choses, le meilleur moyen de se familiariser avec ces méthodes est de simplement expérimenter :-).

105
Matt Solnit

Votre compréhension est incorrecte, dans de tels cas, consultez toujours le JavaDoc .

assertFalse

public static void assertFalse(Java.lang.String message,
                               boolean condition)

Affirme qu'une condition est fausse. Si ce n'est pas le cas, il génère une erreur AssertionError avec le message donné.

Paramètres:

  • message - le message d'identification de AssertionError (null okay)
  • condition - condition à vérifier
29
user177800

Je pense que c'est juste pour votre commodité (et les lecteurs de votre code)

Votre code et vos tests unitaires doivent idéalement être auto-documentés, ce à quoi cette API aide,

Pensez à ce qui est plus clair à lire:

AssertTrue(!(a > 3));

ou

AssertFalse(a > 3);

Lorsque vous ouvrez vos tests après xx mois lorsque vos tests échouent brusquement, il vous faudrait beaucoup moins de temps pour comprendre ce qui n'allait pas dans le second cas (mon avis). Si vous n'êtes pas d'accord, vous pouvez toujours vous en tenir à AssertTrue dans tous les cas :)

9
tdobek

Le point est la sémantique. Dans assertTrue, vous affirmez que l'expression est vraie. Si ce n'est pas le cas, le message sera affiché et l'assertion échouera. Dans assertFalse, vous affirmez qu'une expression est évaluée à false. Si ce n'est pas le cas, le message est affiché et l'assertion échoue.

assertTrue (message, value == false) == assertFalse (message, value);

Celles-ci sont fonctionnellement identiques, mais si vous attendez une valeur false, utilisez assertFalse. Si vous attendez une valeur true, utilisez assertTrue.

9
Xetius

Votre première réaction à ces méthodes m’intéresse beaucoup. Je l'utiliserai dans de futurs arguments selon lesquels assertTrue et assertFalse ne sont pas les outils les plus conviviaux. Si vous utiliseriez

assertThat(thisOrThat, is(false));

il est beaucoup plus lisible et affiche également un meilleur message d'erreur.

7
iwein

Le cours contient une erreur logique:

    assertTrue("Book check in failed", ml.checkIn(b1));

    assertFalse("Book was aleready checked in", ml.checkIn(b1));

Dans la première affirmation, nous nous attendons à ce que l'archivage renvoie Vrai (car l'archivage est réussi). Si cela échouait, nous imprimerions un message du type "échec de l'enregistrement du livre. Maintenant, dans la deuxième affirmation, nous attendons l'échec de l'enregistrement, car l'enregistrement du livre a déjà eu lieu à la première ligne. Nous nous attendons donc à ce qu'un archivage renvoie False. Si, pour une raison quelconque, l’enregistrement retourne un Vrai (ce que nous n’attendons pas), le message ne doit jamais être "Le livre a déjà été archivé", car l’enregistrement a abouti.

2
Ronald Mos

assertTrue échouera si la valeur vérifiée est false et assertFalse fera le contraire: échouera si la valeur vérifiée est true.

Autre chose, votre dernier assertEquals va très probablement échouer, car il comparera la chaîne "Le livre a déjà été extrait" avec la sortie de m1.checkOut (b1, p2). Il faut un troisième paramètre (la deuxième valeur pour vérifier l’égalité).

2
bashflyng