到时候我写了一些junitbenchmark测试。 现在我想从包装类中设置预热和测试轮次。 如何从包装器设置BenchmarkOptions注释?
我的包装类:
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
public class Wrapper {
public static void main(String[] args) {
JUnitCore junit = new JUnitCore();
Result result;
result = junit.run(Test.class);
}
}
我在Test.class中的测试方法:
@BenchmarkOptions(benchmarkRounds = 50, warmupRounds = 10)
@Test
public void test1() {
//something to do
}
答案 0 :(得分:1)
首先,您的代码不起作用。
BenchmarkRule
。Test
的注释时,无法命名类Test
。这不会编译。因此,我将该课程命名为BenchmarkTest
。
回到您的问题,您可以使用BenchmarkOptionsSystemProperties
。在其'文档编写
通过系统属性设置的基准测试的全局设置。如果指定了IGNORE_ANNOTATION_OPTIONS_PROPERTY,则系统属性和默认值将优先于方法级和类级注释。
这允许您按如下方式编写包装器
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import com.carrotsearch.junitbenchmarks.BenchmarkOptionsSystemProperties;
public class Wrapper {
public static void main(String[] args) {
System.setProperty(BenchmarkOptionsSystemProperties.IGNORE_ANNOTATION_OPTIONS_PROPERTY, "true");
System.setProperty(BenchmarkOptionsSystemProperties.WARMUP_ROUNDS_PROPERTY, "20");
System.setProperty(BenchmarkOptionsSystemProperties.BENCHMARK_ROUNDS_PROPERTY, "20");
JUnitCore junit = new JUnitCore();
Result result = junit.run(BenchmarkTest.class);
}
}
相应的基准看起来像这样
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestRule;
import com.carrotsearch.junitbenchmarks.BenchmarkOptions;
import com.carrotsearch.junitbenchmarks.BenchmarkOptionsSystemProperties;
import com.carrotsearch.junitbenchmarks.BenchmarkRule;
public class BenchmarkTest {
@Rule
public TestRule benchmarkRun = new BenchmarkRule(BenchmarkOptionsSystemProperties.getDefaultConsumers());
@Test
@BenchmarkOptions(benchmarkRounds = 1, warmupRounds = 1)
public void test1() {
int tmp = 1 + 2;
}
}
当您执行Wrapper的mein-method时,您将获得此输出,您可以在其中看到注释值为1已被覆盖。
BenchmarkTest.test1:[测量40轮中的20轮,线程:1(顺序)] round:0.00 [+ - 0.00],round.block:0.00 [+ - 0.00],round.gc:0.00 [+ - 0.00],GC.calls:0,GC.time:0.00,time.total:0.01,time .warmup:0.00,time.bench:0.00