Java / JUnit – AssertTrue vs AssertFalse

Je suis plutôt novice en Java et je suis les didacticiels de Eclipse Total Beginner . 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 et assertFalse affichent la chaîne lorsque le second paramètre est assertTrue sur false. Si oui, à quoi sert-il d’avoir les deux?

Edit: Je pense que je vois ce qui me déroutait. L’auteur peut les avoir mis juste pour montrer leurs fonctionnalités (c’est un tutoriel après tout). Et il en a créé un qui échouerait, de sorte que le message s’imprime et me dise POURQUOI il a échoué. Commencer à avoir plus de sens … Je pense que c’est l’explication, mais je ne suis pas sûr.

assertTrue échouera si le second paramètre est évalué à false (en d’autres termes, il garantit que la valeur est true). 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 d’expérimenter :-).

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

assertFalse

 public static void assertFalse(java.lang.Ssortingng message, boolean condition) 

Affirme qu’une condition est fausse. Si ce n’est pas le cas, il jette une AssertionError avec le message donné.

Paramètres:

  • message – le message d’identification de l’assertionError (null okay)
  • condition – condition à vérifier

Le point est la sémantique. Dans assertTrue, vous affirmez que l’expression est vraie. Si ce n’est pas le cas, le message s’affichera et l’assertion échouera. Dans assertFalse, vous affirmez qu’une expression est fausse. 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 vous attendez à ce qu’une valeur soit fausse, utilisez assertFalse . Si vous vous attendez à une valeur vraie , utilisez assertTrue .

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

Votre code et vos tests unitaires devraient idéalement être auto-documentés, ce que 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 soudainement, il vous faudrait beaucoup moins de temps pour comprendre ce qui a mal tourné dans le second cas (mon avis). Si vous n’êtes pas d’accord, vous pouvez toujours vous en tenir à AssertTrue pour toutes les affaires 🙂

Votre première réaction à ces méthodes est très intéressante pour moi. Je vais l’utiliser dans les futurs arguments que 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 un meilleur message d’erreur.

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

Autre chose, votre dernier assertEquals échouera très probablement, car il comparera la chaîne “Livre déjà extrait” avec la sortie de m1.checkOut (b1, p2). Il a besoin d’un troisième paramètre (la deuxième valeur pour vérifier l’égalité).

Le cours contient une erreur logique:

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

Dans le premier cas, nous nous attendons à ce que checkIn renvoie True (parce que checkin est réussi). Si cela échouait, nous imprimerions un message du type “échec de l’archivage du livre. Maintenant, nous nous attendons à ce que le checkIn échoue, car le livre a déjà été archivé dans la première ligne. Si pour une raison quelconque, checkin renvoie un True (ce à quoi nous ne nous attendons pas) que le message ne devrait jamais être “Book a déjà été archivé”, car le checkin a été un succès.