JUnit - 5.2 Regrouper plusieurs assertions avec assertAll

Un test unitaire vérifie souvent plusieurs valeurs à la fois. Par défaut, JUnit s'arrête à la première assertion qui échoue, et les suivantes ne sont jamais exécutées. Cette leçon prend l'exemple d'une méthode qui cherche le codeur ayant le pire indice de masse corporelle (IMC), et montre comment regrouper les assertions pour obtenir un diagnostic complet.

Tester la méthode qui trouve le pire IMC

La méthode étudiée parcourt une liste de codeurs et renvoie celui qui a le pire IMC, c'est-à-dire le plus mauvais rapport entre le poids et la taille. Pour calculer cet indice, elle s'appuie sur une méthode privée qui calcule l'IMC d'un codeur donné.

Le test vérifie d'abord que la liste n'est pas vide. On crée donc une liste de codeurs, on y ajoute les données de test, puis on appelle la méthode. Le résultat est comparé aux valeurs attendues avec assertEquals.

Le premier argument de assertEquals est la valeur attendue, et le second est la valeur réelle. On procède de la même façon pour la taille, puis pour le poids du codeur renvoyé.

Le problème : un test qui s'arrête à la première erreur

Si la taille attendue est fausse, la première assertion échoue et la seconde n'est jamais exécutée. Le rapport ne montre alors qu'un seul échec, même si le poids est faux lui aussi.

Pour le démontrer, la vidéo modifie volontairement la taille et le poids attendus. Les deux valeurs sont fausses, mais le test n'affiche que le premier échec. On ne peut donc pas savoir si le poids était également incorrect.

Regrouper les assertions avec assertAll

La solution consiste à entourer les assertions avec assertAll. Chaque assertion devient une expression lambda, avec des parenthèses vides et une flèche. Les expressions sont séparées par des virgules, et non par des points-virgules.

Une fois ce changement fait, le test affiche les deux échecs. Chaque assertion est exécutée, même si la précédente a échoué.

Il faut regrouper les assertions qui ont un sens ensemble. Ici, le poids et la taille sont liés, car la formule de l'IMC utilise ces deux valeurs.

assertAll(
    () -> assertEquals(<taille-attendue>, <taille-du-codeur>),
    () -> assertEquals(<poids-attendu>, <poids-du-codeur>)
);
  • Entourer les assertions liées avec assertAll.
  • Écrire chaque assertion comme une expression lambda.
  • Séparer les assertions par une virgule.
  • Relancer le test pour voir tous les échecs.

En résumé

Un test qui vérifie plusieurs valeurs liées doit les contrôler ensemble. Avec assertAll, JUnit exécute toutes les assertions regroupées et signale chaque échec. Le rapport devient ainsi plus utile pour corriger le code. Pour un calcul d'IMC, le poids et la taille doivent donc être vérifiés en même temps.

Points clés

  • Par défaut, un test JUnit s'arrête à la première assertion en échec.
  • assertEquals reçoit d'abord la valeur attendue, puis la valeur réelle.
  • assertAll exécute toutes les assertions qu'il contient.
  • Chaque assertion regroupée s'écrit comme une expression lambda, séparée par une virgule.
  • Il faut regrouper les assertions qui ont un sens ensemble, comme le poids et la taille pour un IMC.

Questions fréquentes

Pourquoi un test s'arrête-t-il à la première erreur ?

Une assertion en échec interrompt l'exécution de la méthode de test. Les assertions suivantes ne sont donc jamais évaluées.

Quand utiliser assertAll ?

Utilisez-le quand plusieurs valeurs liées doivent être vérifiées ensemble. La vidéo prend l'exemple du poids et de la taille, utilisés ensemble dans le calcul de l'IMC.

Faut-il regrouper toutes les assertions d'un test ?

Non. Regroupez seulement les assertions qui forment un ensemble logique, afin que le rapport reste lisible.