java - 在 @Rule 中并行化测试执行

标签 java junit junit-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() 中,并按照注释中的描述进行调度。问题是:在我的规则中,只有调度发生,运行器不知道(或关心)所有的可运行对象,这些可运行对象只运行到设置整个测试套件所需的时间。所以我试图将对 evalute() 的调用添加到测试运行器中。第一次尝试是使用 JUnitCore.run(...),这当然以递归结束。

接下来的尝试是收集所有的 future 并等待它们完成。这在每个测试的基础上工作正常,但我想并行执行整个测试套件。而且,在我的测试报告中,我只看到测试执行了一次。

然后我想我使用一个带有上下文(一个从所有测试中收集所有 future 的对象)作为参数的参数化套件,但我没有找到将这个上下文对象提升到测试的方法,每个测试都有有自己的参数。

我现在寻求一种方法,将我的规则中的多个执行添加到正在执行它的测试运行程序。

最佳答案

如果我的理解正确,您是在尝试控制测试运行程序的执行行为。 TestRule 可能仅限于实现该目标。但是如何编写自己的 Runner 来控制单元测试的执行流程呢?看看 ParentRunner of JUnit .从那里,您应该很好地了解基本调度的工作原理,并可能实现您自己的 org.junit.experimental.ParallelComputer 版本。

关于java - 在 @Rule 中并行化测试执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20473217/

相关文章:

java - spring mongorepository save 抛出重复键异常

java - 在现有的大型 Java 代码库中构建测试套件

androidTest 未编译,显示无法解析符号

java - JUnit getMethodName 返回 null

java - Groovy 类中 @Rule(JUnit) 声明和赋值的逻辑是什么

java - 有没有办法在 Java 8 中执行 Ruby every_slice ?

java - 如何将 Microsoft Locale ID (LCID) 转换为 Java 中的语言代码或 Locale 对象

java - 通过链接更改 JLABEL 的颜色

java - FitNesse 与 JUnit : Execute suites in parallel

java - 测试失败时记录异常的最佳方式(例如使用 junit 规则)