Domanda

Cito questo post dalla exubero's . Penso che questa voce andrà a beneficio di tutti coloro che stanno eseguendo un test unitario:

Esistono molti metodi diversi che iniziano con assert definito nella classe Assert di Junit. Ognuno di questi metodi ha argomenti e semantica leggermente diversi su ciò che stanno affermando.

Quanto segue mostra alcuni usi irregolari di assertTrue:

assertTrue("Objects must be the same", expected == actual);
assertTrue("Objects must be equal", expected.equals(actual));
assertTrue("Object must be null", actual == null);
assertTrue("Object must not be null", actual != null);

Alcuni esperti di unit test hanno sottolineato che il codice sopra potrebbe essere scritto meglio come:

assertSame("Objects must be the same", expected, actual);
assertEquals("Objects must be equal", expected, actual);
assertNull("Object must be null", actual);
assertNotNull("Object must not be null", actual);

Uno dei vantaggi dell'utilizzo dell'appropriato 'assertXXX ()' aumenterà la leggibilità del test unitario. Qualcuno può indicare quali altri vantaggi di utilizzare l'appropriato 'assertXXX ()'?

È stato utile?

Soluzione

Non sono uno sviluppatore Java e non so cosa genera JUnit quando un'asserzione fallisce. Molti framework di unit test che ho usato producono migliori informazioni sugli errori quando si usa qualcosa come assertEquals.

Lascia che ti mostri un esempio di cosa sto parlando:

assertTrue("Objects must be equal", "One" == "Two");
assertEquals("Objects must be equal", "One", "Two");

Nel primo caso puoi avere un output di errore come questo:

Errore: il vero valore atteso era falso.

Output per il secondo caso:

Errore: eseguito " Uno " effettivo era " Due " ;.

Come puoi vedere, il secondo caso fornisce informazioni migliori e più significative.

Altri suggerimenti

In aggiunta a quanto sopra indicato da @Vadim, l'uso dell'asserzione corretta può proteggere da bug creati da cut-copy-paste dei test.

Ad esempio

assertTrue("Objects must not be the same", expected != actual);

Viene quindi copiato e modificato in

assertTrue("Objects must not be the same", newobject == actual);

Quando il codice cambia e questo test fallisce e il commento inganna lo sviluppatore successivo per " fix " il codice in un modo che introduce un nuovo bug.

Se il codice taglia-copia-incolla era qualcosa del genere:

assertFalse("Objects must be the same", newobject == actual);

La non congruenza del commento, l'affermazione e il caso di prova possono essere più evidenti.

E sì, l'ho visto accadere.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top