Рассмотрим jmh-тест ниже.
@State(Scope.Thread)
public class Test {
private int value;
@Benchmark
public int testF() {
return f(value);
}
@Benchmark
public int testG() {
return g(value);
}
}
Как лучше всего протестировать функции f
и g
для широкого диапазона их аргументов? @Param
будет работать только для небольшого количества различных входных данных, @Setup(Level.Invocation)
может повлиять на точность результатов. Другие способы (такие как создание массива входных данных и увеличение индекса внутри эталонных тестов) приводят к изменению состояния из методов эталонных тестов.
private int[] values;
private int index;
@Setup
private void generateValues() {
values = new int[0x10000];
...
index = 0;
}
private int nextValue() {
return values[index++ & 0xFFFF];
}
@Benchmark
private int testF() {
return f(nextValue());
}
Как правило, это плохая идея - изменить состояние с помощью тестовых методов?