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