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

2022-09-01 12:32:22

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

  • 测试数据准备
  • 执行业务逻辑
  • 断言结果

我需要一个关于我的商业逻辑的执行时间的更详细的陈述,并且只有我的商业逻辑。这就是我在测试用例中所做的:

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

在单元测试中,我更喜欢使用JUnit 4注释向测试添加超时,以确定测试是否通过(足够快):

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

为了确定业务逻辑的确切运行时,我会像您一样在关键代码路径之前和之后添加 Time 语句,重复几次以获得学术上正确的结果,然后再次删除这些语句,以便精简代码。

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引入了秒表@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);
     }
}

推荐