Qual è l'uso effettivo di "fail" nel caso di test JUnit?Qual è l'uso effettivo di "fail" nel caso di test JUnit?
risposta
Alcuni casi in cui ho trovato utile:
- contrassegnare un test che è incompleta, in modo che non riesce e si avverte fino a quando si può finirlo
- assicurandosi viene generata un'eccezione:
try{ // do stuff... fail("Exception not thrown"); }catch(Exception e){ assertTrue(e.hasSomeFlag()); }
Nota:
Dal JUnit4, c'è un modo più elegante per testare che un'eccezione viene gettata: usare l'annotazione @Test(expected=IndexOutOfBoundsException.class)
Tuttavia, questo non funzionerà se anche vuoi controllare l'eccezione, quindi hai ancora bisogno di fail()
.
Penso che il caso di utilizzo normale sia quello di chiamarlo quando nessuna eccezione è stata lanciata in un test negativo.
Qualcosa come il seguente pseudo-codice:
test_addNilThrowsNullPointerException()
{
try {
foo.add(NIL); // we expect a NullPointerException here
fail("No NullPointerException"); // cause the test to fail if we reach this
} catch (NullNullPointerException e) {
// OK got the expected exception
}
}
Se non si controlla qualcosa nel blocco catch, è possibile utilizzare l'annotazione del metodo @ExpectedException (NullNullPointerException.class) per dichiarare che si prevede un'eccezione (di un tipo speciale). – FrVaBe
Diciamo che si sta scrivendo un banco di prova per un flusso ve in cui il codice in fase di sperimentazione dovrebbe sollevare un'eccezione
try{
bizMethod(badData);
fail(); // FAIL when no exception is thrown
} catch (BizException e) {
assert(e.errorCode == THE_ERROR_CODE_U_R_LOOKING_FOR)
}
Questo è come io uso il metodo Fail.
ci sono tre stati che il tuo caso di test può finire in
- Superato: la funzione in prova eseguita con successo e restituito dati come previsto
- non passato: la funzione in prova eseguita con successo, ma la dati restituiti non era come previsto
- Impossibile: La funzione non è stata eseguita con successo e questo non era
previsti (a differenza dei casi di test negativi che prevedono un'eccezione a ).
Se si utilizza eclissi, tre stati sono indicati rispettivamente da un indicatore verde, blu e rosso.
Uso l'operazione di errore per il terzo scenario.
ad es. : public Integer add (intero a, Integer b) {return new Integer (a.intValue() + b.intValue())}
- Superato il caso: a = new interger (1), b = new Integer (2) e la funzione restituito 3
- caso non passato: a = new interger (1), b = new Integer (2) e la funzione ha restituito valore soem diverso da 3
- caso riuscito: a = null, b = null e la funzione lancia una NullPointerException
Se si guarda il codice sorgente di JUnit, si vedrà che le asserzioni usano 'fail()'. –
ho usato nel caso in cui qualcosa potrebbe essere andato storto nel mio metodo @Before.
public Object obj;
@Before
public void setUp() {
// Do some set up
obj = new Object();
}
@Test
public void testObjectManipulation() {
if(obj == null) {
fail("obj should not be null");
}
// Do some other valuable testing
}
Sì, la verifica delle precondizioni è buona. Tuttavia, se vuoi assicurarti che il metodo '@ Before' abbia successo, probabilmente è meglio controllarlo direttamente in quel metodo. Come bonus, almeno JUnit e TestNG riportano anche un errore diverso per errori dai metodi '@ Before' /' @ After', quindi si può vedere che il problema non era nel test stesso. – sleske
Io, per esempio, utilizzare fail()
indicare prove che non sono ancora finiti (succede); altrimenti, mostrerebbero il successo.
Questo è forse dovuto al fatto che non sono a conoscenza di una sorta di funzionalità incomplete(), che esiste in NUnit.
utilizzare semplicemente:
org.junit.Assert.fail("Exception expected");
Il caso d'uso più importante è probabilmente la verifica un'eccezione.
Mentre junit4 include expected element per verificare se si è verificata un'eccezione, sembra che non faccia parte della più recente junit5. Un altro vantaggio dell'utilizzo di fail()
su expected
è che è possibile combinarlo con finally
consentendo la pulizia del caso di test.
dao.insert(obj);
try {
dao.insert(obj);
fail("No DuplicateKeyException thrown.");
} catch (DuplicateKeyException e) {
assertEquals("Error code doesn't match", 123, e.getErrorCode());
} finally {
//cleanup
dao.delete(obj);
}
Come indicato in un altro commento. Avere un test per fallire fino a quando non è possibile completare l'implementazione sembra ragionevole.
- 1. Ottieni il contesto del progetto di test nel caso di test di junit Android
- 2. Fail un test con Chai.js
- 3. Junit valere o condizione nel mio caso
- 4. JUnit test di base di ATP
- 5. Raggruppamento di test JUnit
- 6. Messaggi di registro nel test di Android Studio junit
- 7. Errore 206 nel test JUnit in Eclipse
- 8. Spring @Transactional non funziona nel test JUnit?
- 9. qual è il modo migliore per calcolare il valore_atteso nel metodo assertEquals() in jUnit
- 10. Utilizzare un'asserzione nel metodo @Before di un test JUnit?
- 11. Qual è la logica di un iteratore fail-safe?
- 12. JUnit: come simulare il test di System.in?
- 13. Java - Generatori di test JUnit
- 14. Classe di test JUnit generica
- 15. Test di due istanze di oggetto sono uguali JUnit
- 16. JUnit opzionali test/richieste
- 17. È una buona idea catturare AssertionError nei test di JUnit?
- 18. JUnit Eclipse - Mostra traccia stack in caso di successo
- 19. JUnit test si blocca
- 20. Netbeans e creazione di test JUnit
- 21. Nel caso di una funzionalità di replica dell'unità Test o di Test?
- 22. Classe di test Junit con più metodi @Test
- 23. Maven - fail build quando il test dell'unità richiede troppo tempo
- 24. Pulizia dopo tutti i test di junit
- 25. Misterioso test "classMethod` nel test di Gradle Scala con JUnit 4
- 26. Come posso confrontare i file in un caso di test JUnit?
- 27. Struts 2.3.14 junit test
- 28. È possibile utilizzare java.lang.instrument.Instrumentation nei test JUnit?
- 29. JUnit esegue test all'interno di un JAR
- 30. Fail di esecuzione org.apache.maven.plugins obiettivo
Considera questo post sul blog sui meriti relativi dell'annotazione rispetto a quella prevista: http://blog.jooq.org/2016/01/20/use-junits-expected-exceptions-sparingly/ – lbalazscs
@sleske "se vuoi anche ispezionare l'eccezione, quindi è ancora necessario fail() "- No. ExpectedException è il modo in cui, vedere https://github.com/junit-team/junit4/wiki/exception-testing – kraxor
@kraxor: Vero, non lo sapevo quando ho scritto la risposta (probabilmente non era nemmeno intorno poi). – sleske