在并行测试时,如何为每个jmv gradle生成不同的系统属性?

Knu*_*sen 10 testing gradle

Gradle允许我启动多个jvms进行测试,如下所示:

test {
   maxParallelForks = 10
}
Run Code Online (Sandbox Code Playgroud)

我的应用程序的一些测试需要一个需要端口的假ftp服务器.使用一个jvm很容易做到这一点:

test {
   systemProperty 'ftpPort', 10000
}
Run Code Online (Sandbox Code Playgroud)

但是,当并行运行时,我需要启动10个假的ftp服务器.如何为gradle生成的每个jvm添加自定义系统属性?

就像是:

test {
   maxParallelForks 10
   customizeForks { index ->
       systemProperty 'ftpPort', 10000 + index
   }
}
Run Code Online (Sandbox Code Playgroud)

小智 1

分叉之前和之后无需执行任何设置任务。但是,您可以覆盖项目中的测试任务来实现该行为(此处为 Java),因为测试任务只是一个类:

  public class ForkTest extends org.gradle.api.tasks.testing.Test {
        private final AtomicInteger nextPort = new AtomicInteger(10000); 
        public Test copyTo(JavaForkOptions target) {
            super.copyTo(target);
            target.systemProperty("ftpPort", nextPort.getAndAIncrement());
            return this;
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后在你的 build.gradle 中:

task testFork(Type: ForkTest){
   forkEvery = 1
   maxParallelForks = 10
   ... 
}
Run Code Online (Sandbox Code Playgroud)