La differenza tra guasto ed errore in JUnit

1. Introduzione

In questo tutorial, esploreremo le differenze tra un errore e un errore nei test JUnit.

In breve, i fallimenti sono affermazioni non soddisfatte mentre gli errori sono dovuti a un'esecuzione anormale del test.

2. Codice di esempio

Consideriamo un esempio molto semplicistico, vale a dire una classe calcolatrice che ha un metodo per dividere due valori doppi :

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

Si noti che Java in realtà non genera un'eccezione ArithmeticException da sola per la doppia divisione: restituisce Infinity o NaN .

3. Esempio di errore

Quando si scrivono unit test con JUnit, è probabile che si verifichino situazioni in cui i test falliscono. Una possibilità è che il nostro codice non soddisfi i criteri di test. Ciò significa che uno o più casi di test falliscono perché le asserzioni non vengono soddisfatte.

Nell'esempio seguente, l'asserzione fallirà, perché il risultato della divisione è 2 e non 15. La nostra affermazione e il risultato effettivo semplicemente non corrispondono:

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

4. Errore di esempio

Un'altra possibilità è che si verifichi una situazione imprevista durante l'esecuzione del test, molto probabilmente a causa di un'eccezione ; ad esempio, l'accesso a un riferimento null solleverà una RuntimeException .

Vediamo un esempio, in cui il test si interromperà con un errore perché stiamo tentando di dividere per zero da cui ci difendiamo esplicitamente lanciando un'eccezione nel codice della nostra calcolatrice:

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

Ora, potremmo correggere questo test includendo semplicemente l'eccezione come una delle nostre affermazioni.

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

Quindi, se viene generata l'eccezione, il test viene superato, ma in caso contrario si tratterebbe di un altro errore.

5. conclusione

Sia il fallimento che l'errore nei test JUnit indicano una situazione indesiderata, ma la loro semantica è diversa. Notifica di errori di un risultato di test non valido, gli errori indicano un'esecuzione di test inaspettata.

Inoltre, controlla il codice di esempio su GitHub.