2012-10-31 23 views
18

E 'possibile in JUnit aggiungere una breve descrizione del test per il futuro lettore (ad es. Cosa viene testato, qualche spiegazione breve, risultato atteso, ...)? Voglio dire qualcosa di simile a ScalaTest, dove posso scrivere:JUnit descrizione del test

test("Testing if true holds") { 
    assert(true) 
} 

approccio ideale sarebbe utilizzando qualche annotazione, ad esempio,

@Test 
@TestDescription("Testing if true holds") 
public void testTrue() { 
    assert(true); 
} 

Pertanto, se corro tali test annotati utilizzando Maven (o qualche strumento simile), ho potuto avere un risultato simile a quello che ho in SBT utilizzando ScalaTest:

- Testing if entity gets saved correctly 
- Testing if saving fails when field Name is not specified 
- ... 

Attualmente posso utilizzare nomi di metodo terribilmente lunghi o scrivere commenti javadoc, che sono non presenti nell'output di build.

Grazie.

+0

Un approccio comune è solo per avere la descrizione nel nome del test, ad esempio 'public void testIfTrueHoldsForNegativeValues ​​()'. Non vedo la necessità di un'annotazione speciale per farlo. – Keppil

+1

Non vedo nulla di sbagliato con i nomi lunghi, in quanto sono abbastanza comuni. Puoi scriverli in modo intelligente, ad es. 'EntityIsSavedCorrectly',' saveFailsWhenNameMissing', ecc Assicurarsi di lasciare fuori la 'test' prefisso è ridondante (esp. Con il' @ Test' annotazione). ScalaTest fornisce solo una stringa dove dovrebbe essere il nome del metodo di JUnit, quindi tutto ciò che stai "perdendo" sono gli spazi. Se devi avere le descrizioni puoi sempre applicarle ai singoli asserti. –

risposta

13

In JUnit 5, c'è @DisplayName annotazione:

@DisplayName consente di dichiarare un nome di visualizzazione personalizzato per il metodo annotato classe di test o il test. I nomi visualizzati sono tipicamente utilizzati per la segnalazione di test in IDE e costruire strumenti e possono contenere spazi, caratteri speciali, e perfino emoji.

Esempio:

@Test 
@DisplayName("Test if true holds") 
public void checkTrue() { 
    assertEquals(true, true); 
} 
+0

C'è un plugin per Android, se si desidera utilizzare JUnit5: https://github.com/mannodermaus/android-junit5 – Christopher

12

Non esattamente quello che si sta cercando, ma è possibile fornire una descrizione su qualsiasi metodo assert.

Qualcosa di simile:

@Test 
public void testTrue() { 
    assertTrue("Testing if true holds", true); 
} 
0

La soluzione dettagliata sarebbe: Si potrebbe aggiungere una Logger per il test, per registrare i risultati in un file. See log4j, ad esempio. Quindi puoi leggere i risultati nel file e anche stampare affermazioni di successo, ciò che gli statini assert non possono.

La soluzione semplice: È possibile aggiungere una descrizione JDoc ad ogni metodo di prova, questo sarà delineato, se si genera il JavaDoc.

Inoltre ogni istruzione assert può fornire un messaggio, che verrà stampato, ogni volta che lo assert non riesce.

/** 
* test the List#size() increasement after adding an Object to a List. 
*/ 
public void testAdd(){ 
    List<Object> list = new LinkedList<>(); 
    list.add(new Object()); 
    assertEquals("size should be 1, because of adding an Object", 1, list.size()); 
} 

NON utilizzare System.out.println("your message"); perché non si sa come verranno eseguiti i test e se l'ambiente non fornisce una console, non verranno visualizzati i messaggi.

2

È possibile assegnare un nome al metodo di prova dopo il test:

public void testThatOnePlusOneEqualsTwo() { 
    assertEquals(2, 1 + 1); 
} 

questo apparirà in Eclipse, infallibile, e la maggior parte degli altri corridori.

10

TestNG lo fa in questo modo, che per me è la soluzione più pulita:

@Test(description="My funky test") 
public void testFunk() { 
    ... 
} 

Vedi http://testng.org/javadocs/org/testng/annotations/Test.html per ulteriori informazioni.

+1

Mi dispiace di annotarlo. La domanda è su Junit not TestNG. Sappiamo tutti che TestNG supporta la descrizione. – nabsATX

+3

È un'informazione rilevante. Contrariamente a quanto è stato detto, non tutti conoscono TestNG e non tutti sanno che, a differenza di JUnit, supporta le descrizioni. Penso che ne valga la pena, anche se la domanda di OP riguarda JUnit. I lettori potrebbero non essere corretti sul framework che usano. –

+0

Almeno per me questo commento è stato utile e non sapevo TestNG, solo perché ho da poco iniziato con Java provenienti da dattiloscritto, dove ho usato Mocha - Credo che se non fossi un JavaScript sviluppatore non si sa su Mocha , destra? – Alfi

4

Preferisco seguire un formato standard durante il test in JUnit.Il nome del test sarebbe

test[method name]_[condition]_[outcome] 

per esempio:

@Test 
public void testCreateObject_nullField_errorMessage(){} 

@Test 
public void testCreateObject_validObject_objectCreated(){} 

Penso che questo approccio è utile quando si fa TDD, perché si può solo iniziare a scrivere tutti i nomi di prova, in modo da sapere cosa si bisogno di testare/sviluppare.

Ancora gradirei una funzionalità di descrizione di prova da JUnit.

E questo è certamente meglio di altri test che ho visto in passato come:

@Test public void testCreateObject1(){} 
@Test public void testCreateObject2(){} 
@Test public void testCreateObject3(){} 

o

@Test public void testCreateObjectWithNullFirstNameAndSecondNameTooLong(){}