web-dev-qa-db-fra.com

assert vs JUnit Assertions

Aujourd'hui, j'ai vu un scénario de test JUnit avec une assertion Java au lieu des assertions JUnit. Existe-t-il des avantages ou des inconvénients importants à préférer l'un à l'autre?

72
Robert

Dans JUnit4, l'exception (en fait Error) levée par une assertion JUnit est la même que l'erreur levée par le mot clé Java assert (AssertionError), donc c'est exactement la même chose que assertTrue et autre que la trace de la pile, vous ne pouviez pas faire la différence.

Cela étant dit, les assertions doivent s'exécuter avec un indicateur spécial dans la JVM, ce qui fait que de nombreux tests semblent passer juste parce que quelqu'un a oublié de configurer le système avec cet indicateur lorsque les tests JUnit ont été exécutés - ce n'est pas bon.

En général, pour cette raison, je dirais que l'utilisation de JUnit assertTrue est la meilleure pratique, car elle garantit l'exécution du test, garantit la cohérence (vous utilisez parfois assertThat ou d'autres assertions qui sont pas un Java) et si le comportement des assertions de JUnit devrait changer à l'avenir (comme la connexion à une sorte de filtre ou à une autre fonctionnalité future de JUnit), votre code pourra en tirer parti.

Le véritable objectif du mot clé assert dans Java est de pouvoir le désactiver sans pénalité d'exécution. Cela ne s'applique pas aux tests unitaires.

88
Yishai

Je préfère les assertions JUnit car elles offrent une API plus riche que l'instruction assert intégrée et, plus important encore, n'ont pas besoin d'être explicitement activées contrairement à assert, qui nécessite le -ea Argument JVM.

26
Adamski

Lorsqu'un test échoue, vous obtenez plus d'informations.

assertEquals(1, 2); donne Java.lang.AssertionError: expected:<1> but was:<2>

contre

assert(1 == 2); donne Java.lang.AssertionError

vous pouvez obtenir encore plus d'informations si vous ajoutez l'argument de message à assertEquals

16
starmer

Je dirais utiliser les assertions JUnit dans les cas de test et utiliser l'assertion de Java dans le code. En d'autres termes, le code réel ne doit jamais avoir de dépendances JUnit, comme c'est évident, et s'il s'agit d'un test, il doit en utiliser les variantes JUnit, jamais l'assertion.

6
Bruno D. Rodrigues

Je dirais que si vous utilisez JUnit, vous devez utiliser les assertions JUnit. assertTrue() est fondamentalement la même chose que assert, sinon pourquoi même utiliser JUnit?

0
CheesePls

Cela peut ne pas s'appliquer si vous utilisez exclusivement des éléments brillants et nouveaux, mais assert n'a pas été introduit dans Java jusqu'à 1.4SE. Par conséquent, si vous devez travailler dans un environnement avec une technologie plus ancienne, vous pouvez vous pencher vers JUnit pour des raisons de compatibilité.

0
Dan Coates