我在理解Geb / Spock测试中遇到的问题时遇到了一些麻烦。我们正在使用gradle,我们正在尝试并行运行测试。据我了解,gradle中的maxParallelForks属性将在单独的JVM中运行测试类。
我遇到的问题是当我有6个测试类并且我将maxParallelForks设置为4时,测试开始时我会得到4个并行运行的测试类。真棒!但最后的两个课程就是问题所在。让我们说在前4个类中运行,其中2个类在1分钟内完成,2个类在5分钟内完成。我所看到的不是前两个完成并开始接下来的两个课程,它似乎等到最后两个长时间运行的课程完成之后再旋转其他分叉。这不太理想。
我误解了什么,或者我错过了某个地方的财产?这是我在build.gradle中的内容:
tasks.withType(Test) {
systemProperties System.properties
maxParallelForks = 4
forkEvery = 1
}
类被分配给forks用于预先执行而不是基于轮询。因此前两个分支将获得两个预先分配的类,另外两个分别为每个类,无论每个类完成多长时间。在最坏的情况下,两个最长的运行类将被分配给一个fork。这就是它的工作原理 - 将类拆分成组,然后将单独的测试jvms(forks)与要为每个类执行的类列表分开。
在旁注 - 你不想做forkEvery = 1
- 这将在每个测试类减慢你的测试执行后重启你的测试jvms没有任何好处。
使用JUNIT套件,您可以决定特定fork需要选择哪些类。
import org.junit.runner.RunWith
import org.junit.runners.Suite
@RunWith(Suite.class)
@Suite.SuiteClasses([
TimeTaking.class, // Class that takes a lot of time
NotSoMuchTimeTaking.class, //Class that is quick
// Add more test classes which need to be executed in same fork.
])
public class FirstTestSuite { // keep this empty
}
同样,创建一个SecondTestSuite {}等等。
除了上述步骤,还要在build.gradle中包含* TestSuite.class
tasks.withType(Test) {
systemProperties System.properties
maxParallelForks = 4
forkEvery = 1
include '**/*TestSuite*.class'
}
这样,您将能够控制执行并决定需要以什么顺序执行哪些测试类。