2014-10-27 2 views
1

времени я пишу некоторые тесты junitbenchmark. теперь я хочу установить разминку и тестовые раунды из класса обертки. Как установить аннотацию BenchmarkOptions из обертки?динамическая аннотация для junitbenchmark

мой обертка класс:

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

Прежде, ваш код не работает.

  1. Вам не хватает BenchmarkRule в вашем тесте.
  2. Вы не можете назвать класс 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; 
    } 

} 

Когда вы затем выполнить Mein-метод обертку вы это вывода, где вы можете видеть, что значения аннотации 1 были переопределены.

BenchmarkTest.test1: [измеренные 20 из 40 раундов, нити: 1 (последовательный)] раунд: 0.00 [+ - 0,00], round.block: 0,00 [+ - 0,00], round.gc: 0,00 [+ - 0,00], GC.calls: 0, GC.time: 0.00, time.tot: 0.01, time.warmup: 0,00, time.bench: 0,00