我想使用Gradle并行运行测试。我的实验向我展示了Gradle在类级别上并行运行测试。我需要它们在方法级别执行。
给出两个这样的测试类:
public class OneTest {
@Test
public void should_sleep_4_seconds() throws Exception {
System.out.println("Start 4 seconds");
Thread.sleep(4000);
System.out.println("Done 4 seconds");
}
}
public class ManyTest {
@Test
public void should_sleep_1_seconds() throws Exception {
System.out.println("Start 1 seconds");
Thread.sleep(1000);
System.out.println("Done 1 seconds");
}
@Test
public void should_sleep_2_seconds() throws Exception {
System.out.println("Start 2 seconds");
Thread.sleep(2000);
System.out.println("Done 2 seconds");
}
}
还有这样的构建脚本:
plugins {
id 'java'
}
sourceCompatibility = '1.8'
targetCompatibility = '1.8'
dependencies {
testCompile 'junit:junit:4.12'
}
test {
testLogging.showStandardStreams = true
maxParallelForks = 3
}
repositories {
mavenCentral()
}
我可以得到以下结果:
./gradlew clean test
> Task :test
se.thinkcode.ManyTest > should_sleep_2_seconds STANDARD_OUT
Start 2 seconds
se.thinkcode.OneTest > should_sleep_4_seconds STANDARD_OUT
Start 4 seconds
se.thinkcode.ManyTest > should_sleep_2_seconds STANDARD_OUT
Done 2 seconds
se.thinkcode.ManyTest > should_sleep_1_seconds STANDARD_OUT
Start 1 seconds
Done 1 seconds
se.thinkcode.OneTest > should_sleep_4_seconds STANDARD_OUT
Done 4 seconds
BUILD SUCCESSFUL in 5s
3 actionable tasks: 3 executed
这告诉我存在并行性,但是它仅在类级别,而不在方法级别。
是否有让Gradle在每种测试方法的一个线程中执行执行的本机方法?
答案 0 :(得分:0)
除了类之外,不可能使用Gradles JUnit 4运行程序并行运行测试。
我无法确定这是否可行,但是您可能想尝试使用JUnit 5的JUnit Platform + JUnit Vintage。看看JUnit 5 starters,了解如何进行设置。
dependencies {
def junit4Version = '4.12'
def junit5Version = '5.3.2'
implementation(enforcedPlatform("org.junit:junit-bom:${junit5Version}")) {
because 'enforce matching Platform, Jupiter, and Vintage versions'
}
// JUnit Jupiter
testImplementation('org.junit.jupiter:junit-jupiter-api')
testImplementation('org.junit.jupiter:junit-jupiter-params')
testRuntimeOnly('org.junit.jupiter:junit-jupiter-engine') {
because 'allows JUnit 5 (read Jupiter) tests to run'
}
// JUnit Vintage
testImplementation("junit:junit:${junit4Version}")
testRuntimeOnly('org.junit.vintage:junit-vintage-engine') {
because 'allows JUnit 3 and JUnit 4 tests to run'
}
}
然后可以将junit.jupiter.execution.parallel.enabled=true
添加到junit-platform.properties
以启用并行执行。参见JUnit 5 User Guide - Parallel Execution。
答案 1 :(得分:0)
不幸的是,gradle仍然不支持此功能。
P.S。应该在this way中计算出maxParallelForks的数量:
maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1
答案 2 :(得分:0)
它是Gradle中的not possible(至今?)。最好的级别是 classes ,其中Maven Surefire plugin可以降至 methods 级别