确定junit的业务相关代码的执行时间的最佳做法是什么?

在eclipse-> junit-view中显示的测试执行时间取决于整个测试用例执行,包括:

  • Testdata准备
  • 执行businesslogic
  • 断言结果

我需要一个关于businesslogic的执行时间和我的businesslogic的更详细的声明。 这就是我在我的测试用例中所做的:

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

嗯……我想我确定时间是一种尴尬的方式。 此外,我不认为有必要声明两个Date变量。

我需要更有效地编写代码的建议……

在unit testing中,我更倾向于使用JUnit 4注释向Test添加超时,以确定测试是否通过(足够快):

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

要确定业务逻辑的确切运行时间,我会像您一样在关键Codepath之前和之后添加Time语句,重复几次以获得学术上正确的结果,并再次删除语句,以便减少代码。

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

JUnit 4.12推出了Stopwatch @Rule 。 使用起来非常困难,应该成为validation测试​​期间花费的时间的事实方法。 这是一个展示其function的示例类:

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

在Guava库中有一个非常有用的实用工具 – 秒表 。
这将允许您编写以下内容

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