junitbenchmark的动态注释

时间:2014-10-27 13:56:51

标签: java dynamic junit annotations

到时候我写了一些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
}

1 个答案:

答案 0 :(得分:1)

首先,您的代码不起作用。

  1. 您的测试中缺少BenchmarkRule
  2. 导入名为Test的注释时,无法命名类Test。这不会编译。
  3. 因此,我将该课程命名为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