Какова наилучшая практика для определения времени выполнения бизнес-кода моего юнита?

Время выполнения теста, отображаемое в eclipse- > junit-view, зависит от выполнения всего тестового примера, которое включает в себя:

  • Предварительная подготовка Testdata​​li >
  • Выполнение бизнес-логики
  • утвердить результаты

Мне нужно более подробное выражение о времени выполнения моей бизнес-логики и только моей бизнес-логике. Это то, что я сделал в своей тестовой папке:

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

Хорошо... Я думаю, что я определяю время очень неудобно. Кроме того, я не думаю, что необходимо объявить две переменные Date.

Мне нужен совет, пишущий этот код более эффективно...

Ответ 1

в unit test Я бы предпочел добавить тайм-аут к тесту с помощью аннотации JUnit 4, чтобы определить, проходит ли тест (достаточно быстро) или нет:

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

Чтобы определить точное время выполнения вашей бизнес-логики, я бы добавил инструкции Time прямо до и после вашей критической Codepath, как вы это делали, повторите несколько раз, чтобы получить схоластически правильные результаты, и снова удалите утверждения, поэтому уменьшите код.

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

Ответ 2

JUnit 4.12 представил Stopwatch @Rule. Это довольно сложно использовать и должно стать фактическим способом проверки времени, проведенного во время тестов. Здесь образец класса демонстрирует свои функциональные возможности:

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

Ответ 3

В библиотеке Guava есть очень полезная утилита - Stopwatch.
Это позволит вам написать следующие

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