2013-02-15 5 views
12

Il tempo di esecuzione di test che viene visualizzata in eclipse-> junit vista dipende tutta l'esecuzione caso di prova che comprende:Qual è la prassi migliore per determinare il tempo di esecuzione del codice relativo al business della mia junit?

  • Testdata preperation
  • Esecuzione businesslogic
  • asserzione risultati

Ho bisogno di una dichiarazione più dettagliata sui tempi di esecuzione della mia businesslogic e solo della mia businesslogic. Questo è quello che ho fatto nella mia TestCase:

Date lNow = new Date(); 
List<Geo> lAllBasisGeo = mGeoEvaluator.evaluateAllGeo(lGeoFixture.getGeo(), lAllGeo); 
Date lStop = new Date(); 
System.out.println("Time of execution in seconds:"+((lStop.getTime()-lNow.getTime())/1000)); 

Beh ... penso di determinare il tempo in un modo davvero imbarazzante. Inoltre non penso che sia necessario dichiarare due variabili Date.

ho bisogno di consigli per iscritto che il codice in modo più efficiente ...

+0

Dai un'occhiata a System.currentTimeMillis o System.nanoTime. Non c'è bisogno di prendere la deviazione con Date. – kutschkem

risposta

21

in una prova di unità io preferirei di aggiungere un timeout per il test con una JUnit 4 annotazione, per determinare se il test viene superato (abbastanza veloce) oppure no:

@Test(timeout=100)//let the test fail after 100 MilliSeconds 
public void infinity() { 
    while(true); 
} 

per determinare l'esatto runtime della vostra logica di business che vorrei aggiungere le dichiarazioni momento giusto, prima e dopo il vostro percorsi di codice critiche come avete fatto, ripetere più volte per ottenere risultati scolasticamente corretti, e togliere di nuovo le dichiarazioni, così slim il codice.

long start = System.currentTimeMillis(); 
//execute logic in between 
long end = System.currentTimeMillis(); 
System.out.println("DEBUG: Logic A took " + (end - start) + " MilliSeconds"); 
9

V'è un'utility molto utile per questo nella biblioteca Guava - Stopwatch.
Questo permetterebbe di scrivere il seguente

final Stopwatch stopwatch = new Stopwatch().start(); 
//dostuff 
System.out.println("Time of execution in seconds:" + stopwatch.stop().elapsed(TimeUnit.SECONDS)); 
+2

Purtroppo non ho il permesso di utilizzare librerie di terze parti. –

19

JUnit 4.12 ha introdotto il Stopwatch@Rule. È piuttosto semplice da usare e dovrebbe diventare il de facto modo di verificare il tempo trascorso durante i test. Ecco una classe di esempio che mostra le sue funzionalità:

public static class StopwatchTest { 
    private static final Logger logger = Logger.getLogger(""); 

    private static void logInfo(Description description, String status, long nanos) { 
     String testName = description.getMethodName(); 
     logger.info(String.format("Test %s %s, spent %d microseconds", 
            testName, status, TimeUnit.NANOSECONDS.toMicros(nanos))); 
    } 

    @Rule 
    public Stopwatch stopwatch = new Stopwatch() { 
     @Override 
     protected void succeeded(long nanos, Description description) { 
      logInfo(description, "succeeded", nanos); 
     } 

     @Override 
     protected void failed(long nanos, Throwable e, Description description) { 
      logInfo(description, "failed", nanos); 
     } 

     @Override 
     protected void skipped(long nanos, AssumptionViolatedException e, Description description) { 
      logInfo(description, "skipped", nanos); 
     } 

     @Override 
     protected void finished(long nanos, Description description) { 
      logInfo(description, "finished", nanos); 
     } 
    }; 

    @Test 
    public void succeeds() { 
    } 

    @Test 
    public void fails() { 
     fail(); 
    } 

    @Test 
    public void skips() { 
     assumeTrue(false); 
    } 

    @Test 
    public void performanceTest() throws InterruptedException { 
     // An example to assert runtime: 
     long delta = 30; 
     Thread.sleep(300L); 
     assertEquals(300d, stopwatch.runtime(MILLISECONDS), delta); 
     Thread.sleep(500L); 
     assertEquals(800d, stopwatch.runtime(MILLISECONDS), delta); 
    } 
} 
+0

Fantastico! Grazie per questo. –

+0

Suggerimento eccezionale. Davvero utile Una domanda. Sembra che stia registrando anche il tempo impiegato dai metodi di setup e di teardown (Before & After e probabilmente anche BeforeClass e AfterClass). Come posso misurare il tempo impiegato dal solo metodo di prova? –

+1

@AndyDufresne Sfortunatamente, non penso che sia possibile misurare solo il metodo di test, usando solo la regola. Ciò accade perché il meccanismo '@ Rule's di JUnit non consente alle regole di fare tale distinzione (sono inconsapevoli persino dell'esistenza di' @ Before's). Suggerisco di registrare il 'stopwatch.runtime (MILLISECONDS)' in un campo dopo tutti i primi (posizionare uno alla fine della classe, come dovrebbe essere eseguito per ultimo) e quindi sottrarlo dal tempo misurato. (Se hai un '@ After', questo dovrebbe essere calcolato lì.) – acdcjunior

Problemi correlati