2013-02-15 3 views
12

Время выполнения теста, которое отображается в eclipse-> JUnit ракурса зависит от целого исполнения корпуса тест, который включает в себя:Какова наилучшая практика определения времени выполнения бизнес-кода моего юнита?

  • Testdata Preperation
  • Выполнение BusinessLogic
  • утверждают результаты

Мне нужно более подробное заявление о времени выполнения моей бизнес-логики и только моей бизнес-логике. Это то, что я сделал в моей 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)); 

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

Мне нужен совет писать этот код более эффективно ...

+0

Посмотрите System.currentTimeMillis или System.nanoTime. Не нужно брать объезд с Датой. – kutschkem

ответ

21

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

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

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

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

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

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

У меня, к сожалению, нет разрешения на использование сторонних библиотек. –

19

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

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

Удивительный! Спасибо за это. –

+0

Удивительный отзыв. Действительно полезно. Один вопрос. Это, похоже, также записывает время, затрачиваемое методами настройки и удаления (до и после и, возможно, BeforeClass и AfterClass). Как я могу измерить время, затраченное только методом тестирования? –

+1

@ AndyDufresne К сожалению, я не думаю, что вы можете измерить только метод тестирования, используя только правило. Это происходит потому, что механизм '@ Rule' JUnit не позволяет правилам делать такое различие (они не знают даже о существовании' @ Before '). Я предлагаю вам записать «stopwatch.runtime (MILLISECONDS)» в поле после всех befores (поместить один в конец класса, как и должно выполняться последним), а затем вычесть его из измеренного времени. (Если у вас есть '@ After', это должно быть рассчитано там.) – acdcjunior

Смежные вопросы