Распараллелить выполнение теста в @ 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.