在@Rule中并行化测试执行

  发布于 2023-02-12 00:17

我想重用一些集成测试来进行负载测试.我实现了一个由注释参数化的规则:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Parallel {

    int invocations() default 1;

    int rampUpTime() default 0;
}

在我的规则实现中,评估注释并设置一个语句,该语句具有如下的evaluate方法:

@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调用将包含在a中Runnable()并按照注释中的描述进行调度.事情是:在我的规则中,只有调度发生,跑步者不知道(或关心)所有可运行的只有在设置整个测试套件时才运行的运行.所以我试图将调用添加evalute()到测试运行器.首先尝试使用JUnitCore.run(...)哪个当然以递归结束.

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

那么我认为我使用带有上下文的参数化套件(一个收集所有测试的所有未来的对象)作为参数,但我没有找到一种方法将这个上下文对象提升为测试,每个测试必须有它的自己的参数.

我现在要求一种方法将我的规则中的多个执行添加到正在执行它的测试运行器.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有