收集并运行所有junit测试,并与其自己的JVM中的每个测试类并行(按类而不是按方法并行化)

时间:2016-07-02 17:33:30

标签: unit-testing android-studio intellij-idea gradle junit

问题
我在一些根软件包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。但是,这仍然按顺序运行每个测试类,并且我没有看到有关并行化的选项。这非常接近我想要的但不完全...... :(

2 个答案:

答案 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跑步者。运行机器的内核越多,执行器就越多!

感谢您分享原来的答案!