Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 确定我的junit的业务相关代码的执行时间的最佳实践是什么?_Java_Junit - Fatal编程技术网

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

Java 确定我的junit的业务相关代码的执行时间的最佳实践是什么?,java,junit,Java,Junit,eclipse->junit视图中显示的测试执行时间取决于整个测试用例的执行,包括: 测试数据预处理 执行业务逻辑 断言结果 我需要一个关于我的businesslogic执行时间的更详细的声明,并且只需要我的businesslogic。 这就是我在测试用例中所做的: Date lNow = new Date(); List<Geo> lAllBasisGeo = mGeoEvaluator.evaluateAllGeo(lGeoFixture.getGeo(), lAllGeo)

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

  • 测试数据预处理
  • 执行业务逻辑
  • 断言结果
我需要一个关于我的businesslogic执行时间的更详细的声明,并且只需要我的businesslogic。 这就是我在测试用例中所做的:

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 lNow=新日期();
List lAllBasisGeo=mGeoEvaluator.evaluateAllGeo(lGeoFixture.getGeo(),lAllGeo);
日期lStop=新日期();
System.out.println(“以秒为单位的执行时间:+((lStop.getTime()-lNow.getTime())/1000));
嗯。。。我想我确定时间的方式真的很尴尬。此外,我认为没有必要声明两个日期变量


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

在Guava库中有一个非常有用的实用程序-。
这将允许您编写以下内容

import com.google.common.base.Stopwatch;

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

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

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

long start = System.currentTimeMillis();
//execute logic in between
long end = System.currentTimeMillis();
System.out.println("DEBUG: Logic A took " + (end - start) + " MilliSeconds");
JUnit4.12引入了。这是一种非常先进的使用方法,应该成为验证测试期间花费时间的实际方法。下面是一个示例类,展示了它的功能:

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

请查看System.currentTimeMillis或System.nanoTime。没有必要绕道日期。很遗憾,我没有使用第三方图书馆的许可证。链接给出了404。您可以为
Stopwatch
类添加import语句吗?好的,我认为使用最新的maven central Guava Core,您必须将对象init更改为
Stopwatch Stopwatch=Stopwatch.createStarted()。不管怎样,谢谢。很棒的小费。真的很有帮助。一个问题。这似乎也记录了setup和teardown方法所花费的时间(在类之前和之后,可能在类之前和类之后)。“我怎样才能仅仅测量测试方法所花费的时间呢?”AndyDufresne不幸的是,我认为你不能仅仅使用规则来测量测试方法。这是因为JUnit的
@Rule
s机制不允许规则进行这种区分(它们甚至不知道
@之前存在
>)。我建议您将
stopwatch.runtime(毫秒)
记录在前面的字段中(将其放在类的末尾,因为它应该最后执行),然后从测量的时间中减去它。(如果在
之后有一个
,则应在此处进行计算。)
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);
     }
}