Oggi ho visto un test case JUnit con un'asserzione java invece delle asserzioni JUnit: ci sono vantaggi o svantaggi significativi nel preferire l'una all'altra?
Oggi ho visto un test case JUnit con un'asserzione java invece delle asserzioni JUnit: ci sono vantaggi o svantaggi significativi nel preferire l'una all'altra?
Risposte:
In JUnit4 l'eccezione (in realtà Error) lanciata da un'asserzione JUnit è la stessa dell'errore generato dalla assert
parola chiave java (AssertionError), quindi è esattamente la stessa assertTrue
e diversa dalla traccia dello stack non si poteva dire la differenza.
Detto questo, le affermazioni devono essere eseguite con un flag speciale nella JVM, facendo apparire molti test superati solo perché qualcuno ha dimenticato di configurare il sistema con quel flag quando sono stati eseguiti i test JUnit - non va bene.
In generale, per questo motivo, direi che usare JUnit assertTrue
è la pratica migliore, perché garantisce che il test venga eseguito, assicura coerenza (a volte usi assertThat
o altre asserzioni che non sono una parola chiave java) e se il comportamento di JUnit afferma dovrebbe cambiare in futuro (come l'aggancio a qualche tipo di filtro o altre funzionalità future di JUnit) il tuo codice sarà in grado di sfruttarlo.
Il vero scopo della parola chiave assert in java è poterla disattivare senza penalità di runtime. Ciò non si applica agli unit test.
Preferisco le asserzioni JUnit in quanto offrono un'API più ricca rispetto assert
all'istruzione incorporata e, cosa più importante, non è necessario abilitarla esplicitamente a differenza di assert
, che richiede l' -ea
argomento JVM.
-ea
è sempre abilitato in mvn test
, non è necessario -ea
. API più ricca, buona cattura. A volte penso che l'API sia utilizzata in modo improprio in test perché non fa parte dell'applicazione (a in api), preferisco chiamarla solo metodi più ricchi.
Quando un test fallisce ottieni più informazioni.
assertEquals(1, 2);
risultati in java.lang.AssertionError: expected:<1> but was:<2>
vs
assert(1 == 2);
risultati in java.lang.AssertionError
puoi ottenere ancora più informazioni se aggiungi l'argomento del messaggio a assertEquals
assert 1==2: "1 is not 2";
.
assert
può essere preferibile - per i controlli di correttezza che avrebbero un impatto sulle prestazioni e quindi sono meglio disabilitati per impostazione predefinita. Tuttavia, la mia esperienza è che la maggior parte delle affermazioni dovrebbe essere sempre attiva.
Direi che usa JUnit asserisce nei casi di test e usa java assert nel codice. In altre parole, il codice reale non dovrà mai avere dipendenze JUnit, come ovvio, e se è un test, dovrebbe usare le sue variazioni JUnit, mai l'assert.
Direi che se stai usando JUnit dovresti usare le asserzioni JUnit. assertTrue()
è fondamentalmente lo stesso di assert
, altrimenti perché usare anche JUnit?
Assert
richiederebbe più boilerplate. assert
senza JUnit richiederebbe di scrivere un intero framework.
Questo potrebbe non essere applicabile se usi esclusivamente cose nuove e brillanti, ma assert non è stato introdotto in Java fino alla 1.4SE. Pertanto, se devi lavorare in un ambiente con una tecnologia precedente, potresti propendere per JUnit per motivi di compatibilità.