问题
我在一些根软件包tests
下进行了一系列junit测试(很多都使用自定义运行程序,如PowerMockRunner或JUnitParamsRunner)(它们位于不同深度的tests
的各种子包中)。
我想收集包tests
下的所有测试,并在另一个JVM中并行运行每个测试类。理想情况下,并行化是可配置的,但number_of_cores的默认值也完全没问题。请注意,我不想在自己的JVM中运行每个方法,而是每个类。
背景
对于我的许多测试,我通过注释@RunWith(PowerMockRunner.class)
和@PowerMockRunnerDelegate(JUnitParamsRunner.class)
将PowerMock与JUnitParams结合使用。我有~9000个单元测试,完成了一个" ok"时间长度,但我是一个8核CPU,系统严重未充分利用默认的一次性测试运行。由于我经常运行测试,额外的时间加起来,我真的想并行运行测试类。
请注意,遗憾的是,在大量的测试中,我需要模拟静态方法,这是我使用PowerMock的原因之一。
我尝试过的事情
必须模拟静态方法使得不可能使用像com.googlecode.junittoolbox.ParallelSuite
这样的东西(这是我的初始解决方案),因为它在同一个JVM中运行所有内容,静态模拟会使所有交错和混乱。或者在我看来至少基于我得到的错误。
我根本不知道JUnit堆栈,但是在探索之后,似乎另一个选择可能是尝试编写并注入我自己的RunnerBuilder
- 但我不是确定我是否可以在RunnerBuilder
内生成另一个JVM进程,不太可能。我认为正确的解决方案是某种线束作为一项琐事。
我还发现了一些Android Studio(Intellij' s)测试选项,但唯一可用的fork选项是method
,这不是我想要的。我目前正在探索这个解决方案,所以也许我会解决这个问题,但我认为我并没有同时问社区,因为我还没有锁定。
UPDATE :最后能够让Android Studio(Intellij)使用选项Test Kind:All in directory
来收集我的所有测试(由于某种原因,包选项没有进行递归搜索)并选择前叉模式Class
。但是,这仍然按顺序运行每个测试类,并且我没有看到有关并行化的选项。这非常接近我想要的但不完全...... :(
答案 0 :(得分:5)
TENTATIVE 回答
不要让这个回答阻止你发布更好的答案。但是,如果我在一周左右没有看到更好的解决方案,我会将其标记为官方解决方案。
我没有使用Intellij(Android Studio)内置的JUnit运行配置,而是注意到Android Studio有一堆预构建的gradle任务,其中一些涉及测试。然而,那些表现出相同的顺序执行问题。然后我找到Run parallel test task using gradle并将以下语句添加到我的根build.gradle
文件中:
subprojects {
tasks.withType(Test) {
maxParallelForks = Runtime.runtime.availableProcessors()
}
}
这很好用,我的CPU现在固定为100%(对于大多数运行,因为未完成的测试类的数量变为< avail处理器显然利用率下降)。
此解决方案的缺点是它没有与Android Studio(Intellij)漂亮的junit runner UI集成。因此,当gradle任务正在进行时,我无法真正看到测试完成率等。在任务执行结束时,它只是吐出总运行时和HTML生成报告的链接。这是一个小问题,我可以完全接受它,但如果我能弄清楚如何改进使用JUnit运行器UI的解决方案,那就太好了。
答案 1 :(得分:1)
当问题发布时,这可能是不可能的,但现在你可以在android studio中轻松完成。
我正在使用gradle构建工具:'com.android.tools.build:gradle:2.2.3'
我在我的根build.gradle
文件中添加了以下内容。
allprojects {
// ...
tasks.withType(Test) {
maxParallelForks = Runtime.runtime.availableProcessors()
}
}
现在,我的测试有多个Gradle Test Executor
跑步者。运行机器的内核越多,执行器就越多!
感谢您分享原来的答案!