2013-04-10 14 views
25

ho alcuni test come questo:Come fare JUnit stampare afferma e risultati

@Test 
public void test01() 
{ 
    Position p = getPositionAt('a', 1); 
    assertNotNull("a1 exists", p); 
    assertNotNull("figure exists a1", p.getFigure()); 

    p = getPositionAt('a', 2); 
    assertNotNull("exists a2", p); 
    assertNull("figure exists a2", p.getFigure()); 

    p = getPositionAt('b', 1); 
    assertNotNull("exists b1", p); 
    assertNull("figure exists b1", p.getFigure()); 
} 

Che cosa ho bisogno durante l'esecuzione di test è quello di stampare ogni messaggio di asserzione stdout e poi risultato della assert.

Questo è formato da richiede classe di test:

a1 exists -success 
figure exists a1 -success 
exists a2 -success 
figure exists a2 -succcess 
exists b1 -succcess 
figure exists b1 -failed 

Ma come fare? Sono abbastanza nuovo con JUnit e non ne ho idea. C'è modo di utilizzare runners e suites? O esistono i metodi assertSuccess(), assertFailed()? Grazie per qualsiasi suggerimento.

+0

Tra l'altro, il parametro 'message' è applicabile solo quando l'asserzione non riesce, in modo che il' messaggio assertNotNull' dovrebbe essere effettivamente "a1 non esiste "ecc ... – Jonathan

+5

qualche motivo particolare per cui vorresti questo? –

+1

Entrambi i tuoi bisogni potrebbero essere considerati un anti-modello nel mondo dei test unitari. I test dovrebbero asserire solo una cosa, quindi non ci dovrebbero essere motivi per volere un'affermazione non-fallimentare.I test devono essere automatizzati con tutte le verifiche effettuate dagli esperti, quindi non ci dovrebbe essere bisogno di una stampa per l'ispezione manuale. In pratica, ci sono buone ragioni per volere il primo, come l'esecuzione di test basati su tabelle e la necessità di più chiamate di asserzione per verificare un fatto logico. Diffida del secondo, però. L'automazione è l'unica soluzione per i test di unità e di regressione. – user7610

risposta

18

In primo luogo, si hanno due problemi non uno. Quando un'asserzione fallisce, viene generata un'eccezione AssertionError. Ciò impedisce a qualsiasi asserzione oltre questo punto di essere controllato. Per affrontare questo è necessario utilizzare un ErrorCollector.

In secondo luogo, non credo ci sia alcun modo integrato in JUnit per farlo. Tuttavia, è possibile implementare i propri metodi che avvolgono le asserzioni:

public static void assertNotNull(String description, Object object){ 
    try{ 
      assertNotNull(description, object); 
      System.out.println(description + " - passed"); 
    }catch(AssertionError e){ 
      System.out.println(description + " - failed"); 

     throw e; 
    } 
} 
+2

non dovrebbe essere l'assertNotNull all'interno della funzione essere TestCase.assertNotNull? – IHeartAndroid

2

Un'ultima opzione di resort consiste nell'associare ogni asserzione con uno System.out.println corrispondente, anche se ovviamente non è l'ideale. Tuttavia, risolverà il problema se tutto il resto fallisce.

10

Tutti i metodi assertXXX hanno una forma che consente la visualizzazione di una stringa in caso di errore:

assertNotNull("exists a2", p); // prints "exists a2" if p is null

Non v'è alcun particolare valore nella stampa di un messaggio in caso di successo.

EDIT

Junit fornisce tipicamente 2 forme di un'asserzione. Per seguire l'esempio di cui sopra, è possibile verificare per un valore nullo in 1 di 2 modi:

assertNotNull(p)

o

assertNotNull("my message on failure", p)

Il quadro sarà stampare i messaggi di errore con nessun altro sforzo richiesto da te (è fornito dal framework).

Per testare le eccezioni si può usare il seguente schema:

try{ 
    someCall(); 
catch(Exception e){ 
    fail(): // exception shouldn't happen, use assertTrue(true) if it should 
} 

Anche in questo caso, ci sono versioni di questi metodi per l'aggiunta di un messaggio

Controllare il API

+0

Ok, quindi posso spostare il messaggio di fronte all'asserzione, ma come catturare se l'assert passato o non è riuscito a stampare il messaggio di risultato? –

+1

rileva l'eccezione come mostrato nella mia risposta, ma se lo fai, assicurati di rilanciare l'eccezione (o intrappolarla in un raccoglitore di errori) altrimenti otterrai falsi positivi –

+0

I assertTrue ("qualche messaggio", asserzione); e il messaggio non viene ancora stampato. –

Problemi correlati