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?
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.
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.
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
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.
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?
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é.