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