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 assertparola chiave java (AssertionError), quindi è esattamente la stessa assertTruee 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 assertThato 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 assertall'istruzione incorporata e, cosa più importante, non è necessario abilitarla esplicitamente a differenza di assert, che richiede l' -eaargomento 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";.
assertpuò 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?
Assertrichiederebbe più boilerplate. assertsenza 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à.