我最近几天一直在寻找答案,却找不到答案。我能找到的最接近的答案是https://discuss.gradle.org/t/not-using-all-test-executors-when-executing-junit-tests-filtered-by-the-category-annotation/12855,它没有完全回答我的问题。
顺便说一下,我有一个基于Gradle的Selenium测试项目。我们在Jenkins上构建这个项目,在20个并发线程中运行测试。我拥有的唯一测试类的总数是87。因此,我希望gradle至少可以释放5批测试项目,测试项目是使用Cucumber JVM构建、构建和触发Jenkins到Selenium Hub的测试。我试图通过尽可能多地利用网格来增加测试的并行性。但是,当测试的数量开始增加时,问题就开始了。
当我从Jenkins开始测试时,我第一次观察到测试执行了所有20个测试过程,我看到第二批也是以相同数量的进程开始的。在第二批处理之后,流程返回到单一模式,整个作业花了14个小时才完成,这违背了并行测试执行的目的。
分级属性:
jvmArgs '-Xms128m', '-Xmx1024m', '-XX:MaxPermSize=128m'
Runtime.runtime.availableProcessors().toString()) as int
maxParallelForks = PropertyUtils.getProperty('test.parallel', '15') as int
forkEvery = PropertyUtils.getProperty('test.forkEvery', '0') as int
CLI:
gradle clean test -Dtest.single=*TestRun --info
我已经阅读了我可能找到的所有文件,但都没有得到答复。如果有人能帮我解决这些问题,我将不胜感激。
1.如何在内部对测试运行器进行分级处理?例如,如果20个执行程序启动并测试1,2,3执行程序比其他执行程序执行得更快,那么这三个执行器会得到三个测试类还是等待整个批处理完成执行?
2. forkEvery会影响并行测试期间的执行方式吗?
詹金斯日志
成功启动进程“分级测试执行器6” 成功启动进程“分级测试执行器13” 成功启动进程“分级测试执行器14” 成功启动进程“分级测试执行器5” 成功启动进程“分级测试执行器16” 成功启动进程“分级测试执行器8” 成功启动进程“分级测试执行器19” 成功启动进程“分级测试执行器4” 成功启动进程“分级测试执行器2” 成功启动进程“分级测试执行器11” 成功启动进程“分级测试执行器10” 成功启动进程“分级测试执行器18” 成功启动进程“分级测试执行器1” 成功启动进程“分级测试执行器20” 成功启动进程“分级测试执行器7” 成功启动进程“分级测试执行器9” 成功启动进程“分级测试执行器3” 成功启动进程“分级测试执行器15” 成功启动进程“分级测试执行器17” 成功启动进程“分级测试执行器12” Gradle Test Executor 13开始执行测试。 Gradle Test Executor 14开始执行测试。 Gradle Test Executor 6开始执行测试。 Gradle Test Executor 5开始执行测试。 Gradle Test Executor 16开始执行测试。 Gradle Test Executor 19开始执行测试。 Gradle Test Executor 8开始执行测试。 Gradle Test Executor 4开始执行测试。 Gradle Test Executor 2开始执行测试。 Gradle Test Executor 10开始执行测试。 Gradle Test Executor 11开始执行测试。 Gradle Test Executor 18开始执行测试。 Gradle Test Executor 1开始执行测试。 Gradle Test Executor 20开始执行测试。 Gradle Test Executor 7开始执行测试。 Gradle Test Executor 3开始执行测试。 Gradle Test Executor 9开始执行测试。 Gradle Test Executor 17开始执行测试。 Gradle Test Executor 15开始执行测试。 Gradle Test Executor 12开始执行测试。
发布于 2017-04-18 15:02:57
forkEvery的默认值是0。
据文献资料 forkEvery说
要在分叉测试进程中执行的测试类的最大数量。当达到此限制时,将重新启动分叉测试过程。默认值为0(无最大值)。
因此,gradle (可能还有junit)将按类进行分叉,而不是在类内进行测试。听起来,在87个测试类中,有几个具有长时间运行的测试或大量的测试,它们以一个分叉的测试过程结束。我会考虑将forkEvery设置为1,这将确保每个测试类都被发送到一个新的分叉。如果仍然存在问题,您可能需要找出哪些测试类花费的时间最多。考虑将这些类分成更小的测试组,这样测试就可以分散在每个jvm上。如果这是一个需要花费很长时间的测试,请考虑重新设计它,并可能从中创建更小的测试。
我不相信gradle会分批进行测试。当工作人员可用时,它将从剩余测试队列中获取一个测试类。您必须看看JUnit是如何工作的,因为我确信gradle只是将这些配置传递给JUnit。
https://stackoverflow.com/questions/35963158
复制相似问题