La différence entre l'échec et l'erreur dans JUnit

1. Introduction

Dans ce didacticiel, nous explorerons les différences entre un échec et une erreur dans les tests JUnit.

En bref, les échecs sont des assertions non satisfaites tandis que les erreurs sont dues à une exécution de test anormale.

2. Exemple de code

Prenons un exemple très simpliste, à savoir une classe de calculatrice qui a une méthode pour diviser deux valeurs doubles :

public static double divideNumbers(double dividend, double divisor) { if (divisor == 0) { throw new ArithmeticException("Division by zero!"); } return dividend / divisor; }

Notez que Java ne lance pas réellement une exception ArithmeticException pour la double division - il renvoie Infinity ou NaN .

3. Exemple d'échec

Lors de l'écriture de tests unitaires avec JUnit, il y aura probablement des situations où les tests échouent. Une possibilité est que notre code ne répond pas à ses critères de test. Cela signifie qu'un ou plusieurs cas de test échouent en raison d' assertions non satisfaites.

Dans l'exemple suivant, l'assertion échouera, car le résultat de la division est 2 et non 15. Notre assertion et le résultat réel ne correspondent tout simplement pas:

@Test void whenDivideNumbers_thenExpectWrongResult() { double result = SimpleCalculator.divideNumbers(6, 3); assertEquals(15, result); }

4. Exemple d'erreur

Une autre possibilité est que nous ayons une situation inattendue pendant l'exécution du test, probablement en raison d'une exception ; par exemple, accéder à une référence nulle lèvera une RuntimeException .

Voyons un exemple, où le test s'interrompra avec une erreur car nous essayons de diviser par zéro ce que nous protégeons explicitement en lançant une exception dans notre code de calculatrice:

@Test void whenDivideByZero_thenThrowsException(){ SimpleCalculator.divideNumbers(10, 0); } 

Maintenant, nous pourrions corriger ce test en incluant simplement l'exception comme l'une de nos assertions.

@Test void whenDivideByZero_thenAssertException(){ assertThrows(ArithmeticException.class, () -> SimpleCalculator.divideNumbers(10, 0)); }

Ensuite, si l'exception est levée, le test réussit, mais sinon, ce serait un autre échec.

5. Conclusion

L'échec et l'erreur dans les tests JUnit indiquent une situation indésirable, mais leur sémantique est différente. Les échecs signalent un résultat de test non valide, les erreurs indiquent une exécution de test inattendue.

Veuillez également consulter l'exemple de code sur GitHub.