Frage Was ist die beste Vorgehensweise, um die Ausführungszeit des geschäftsrelevanten Codes meines Junits zu bestimmen?


Die Testausführungszeit, die in eclipse-> junit-view angezeigt wird, hängt von der gesamten Testfallausführung ab und beinhaltet:

  • Testdatenvorbereitung
  • Ausführen von Businesslogik
  • Ergebnisse bestätigen

Ich brauche eine detailliertere Aussage über die Ausführungszeit meiner Geschäftslogik und nur meine Geschäftslogik. Das habe ich in meinem Testfall getan:

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));

Nun ... ich denke, ich bestimmt die Zeit in einer wirklich peinlichen Art und Weise. Außerdem denke ich nicht, dass es notwendig ist, zwei Date-Variablen zu deklarieren.

Ich brauche den Rat, diesen Code effizienter zu schreiben ...


13
2018-02-15 09:57


Ursprung


Antworten:


In einem Komponententest würde ich es bevorzugen, ein Timeout für den Test mit einer JUnit 4 Annotation hinzuzufügen, um festzustellen, ob der Test erfolgreich ist (schnell genug) oder nicht:

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

Um die genaue Laufzeit Ihrer Geschäftslogik zu bestimmen, würde ich die Zeitanweisungen direkt vor und nach Ihrem kritischen Codepath wie Sie hinzufügen, mehrmals wiederholen, um scholastisch korrekte Ergebnisse zu erhalten, und die Anweisungen wieder entfernen, also den Code abspecken.

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

22
2018-02-15 11:54



JUnit 4.12 führte die Stopwatch  @Rule. Es ist ziemlich geradlinig zu verwenden und sollte das sein de facto Möglichkeit, die während der Tests verbrachte Zeit zu überprüfen. Hier ist eine Beispielklasse, die ihre Funktionalitäten zeigt:

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);
     }
}

20
2018-01-09 20:45



Es gibt ein sehr nützliches Hilfsmittel dafür in der Guava-Bibliothek - Stoppuhr.
Dies würde Ihnen erlauben, Folgendes zu schreiben

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

10
2018-02-15 10:30