Распараллелить выполнение теста в @ Rule
Я хочу, чтобы повторно использовать некоторые интеграционные тесты для тестирования нагрузки. Я реализовал правило, которое параметризовано аннотацией:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Parallel {
int invocations() default 1;
int rampUpTime() default 0;
}
в моей реализации правила аннотация оценивается и настраивается оператор, который имеет такой метод оценки:
@Override
public void evaluate() throws Throwable {
ScheduledExecutorService exe = Executors.newScheduledThreadPool(invocations);
for (int i = 0; i < invocations; i++) {
ScheduledFuture<?> scheduledFuture = exe.schedule(new Runnable() {
@Override
public void run() {
try {
invocated++;
// Request test = Request.method(description.getTestClass(), description.getMethodName());
// new JUnitCore().run(test);
statement.evaluate();
} catch (Throwable e) {
e.printStackTrace();
}
}
}, i * rampUpTime, this.timeUnit);
futures.add(scheduledFuture);
}
}
Итак,evaluate
вызов завернут в Runnable()
и запланировано, как описано в аннотации. Дело в том, что в моем правиле происходит только планирование, бегун не знает (или care) обо всех runables, которые работают только до тех пор, пока требуется настроить весь набор тестов. Поэтому я пытаюсь добавить вызовы в evalute()
для выполнения тестов. Первая попытка была использовать JUnitCore.run(...)
который, конечно, заканчивается рекурсией.
следующая попытка была собрать все фьючерсы и ждать их, чтобы закончить. Это отлично работает на основе каждого теста, но я хочу выполнить весь набор тестов параллельно. А также, в моем тестовом отчете, я вижу, что тест выполняется только один раз.
тогда Я думал, что использую параметризованный набор с контекстом (объект, который собирает все фьючерсы из всех тестов) в качестве параметра, но я не нашел способ продвинуть этот объект контекста в тесты, каждый тест должен иметь свои собственные параметры.
Im теперь просит способ добавить несколько исполнений из моего правила в тестовый бегун, который его выполняет.
1 ответов
Если я правильно вас понимаю, вы пытаетесь контролировать поведение выполнения тестового бегуна. А TestRule
может быть ограничено для достижения этой цели. А как насчет написания собственных Runner
который контролирует поток выполнения модульного теста? Просто взгляните на
ParentRunner из JUnit в. Оттуда вы должны получить довольно хорошее представление о том, как работает базовое планирование, и, возможно, реализовать свою собственную версию org.junit.experimental.ParallelComputer
.