Какова наилучшая практика для определения времени выполнения бизнес-кода моего юнита?
Время выполнения теста, отображаемое в eclipse- > junit-view, зависит от выполнения всего тестового примера, которое включает в себя:
- Предварительная подготовка Testdatali >
- Выполнение бизнес-логики
- утвердить результаты
Мне нужно более подробное выражение о времени выполнения моей бизнес-логики и только моей бизнес-логике.
Это то, что я сделал в своей тестовой папке:
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));