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

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

问题
我有一堆 junit 测试(许多使用自定义运行程序,如 PowerMockRunner 或 JUnitParamsRunner)都在某个根包下 tests (它们位于不同深度的 tests 的各种子包中)。

我想收集包tests下的所有测试并运行每个 测试类在不同的JVM中,并行。理想情况下,并行化是可配置的,但 number_of_cores 的默认值也完全可以。请注意,我不想在自己的 JVM 中运行每个方法,而是在每个类中运行。

背景
我正在通过注释 @RunWith(PowerMockRunner.class) 结合使用 PowerMock 和 JUnitParams和 @PowerMockRunnerDelegate(JUnitParamsRunner.class)对于我的许多测试。我有大约 9000 个单元测试,它们在“好的”时间内完成,但我有一个 8 核 CPU,并且系统在默认的一次测试一次运行程序中严重未得到充分利用。由于我经常运行测试,额外的时间加起来,我真的很想并行运行测试类。

请注意,不幸的是,在很多测试中,我需要模拟静态方法,这是我使用 PowerMock 的部分原因。

我试过的
必须模拟静态方法使得无法使用像 com.googlecode.junittoolbox.ParallelSuite 这样的东西。 (这是我最初的解决方案),因为它在同一个 JVM 中运行所有东西,并且静态模拟被交错和搞砸了。至少在我看来,至少基于我得到的错误。

我根本不知道 JUnit 堆栈,但是在四处寻找之后,似乎另一种选择可能是尝试编写和注入(inject)我自己的 RunnerBuilder -- 但我不确定我是否可以从 RunnerBuilder 中生成另一个 JVM 进程,不太可能。我认为正确的解决方案是某种作为 gradle 任务的工具。

我还刚刚发现了一些 Android Studio (Intellij) 测试选项,但唯一可用的 fork 选项是 method这不是我想要的。我目前正在探索这个解决方案,所以也许我会弄明白,但我想我会同时询问社区,因为我还没有多少锁。

更新 : 最后能够让 Android Studio (Intellij) 使用选项测试类型收集我的所有测试:All in directory (由于某种原因,package 选项没有进行递归搜索)和选择 fork 模式 Class .但是,这仍然会按顺序运行找到的每个测试类,并且我没有看到关于并行化的选项。这与我想要的非常接近,但并不完全...... :(

最佳答案

我没有使用 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%(在运行的大部分时间里,随着未完成的测试类的数量变为 < 可用处理器的利用率明显下降)。

此解决方案的缺点 是它没有与 Android Studio (Intellij) 漂亮的 junit 运行器 UI 集成。因此,当 gradle 任务正在进行时,我无法真正看到测试完成率等。在任务执行结束时,它只是吐出总运行时间和指向 HTML 生成报告的链接。这是一个小问题,我完全可以接受,但如果我能弄清楚如何改进解决方案以使用 JUnit 运行器 UI,那就太好了。

关于unit-testing - 在其自己的 JVM 中与每个测试类并行收集并运行所有 junit 测试(按类并行化,而不是按方法并行化),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38162802/

相关文章:

c++ - 混合 C++/Cli 项目的单元测试

android-studio - NDK 不包含任何平台

java - 将 YouTube 数据 API 添加到 Android Studio

java - 如何在 build.gradle 文件上实现 intelliJ 插件操作?

java - 设置Jframe图像

java - JPA 2.0 为单元测试禁用 session 缓存

c# - 使用两个函数进行单元测试

c# - 单元测试 ASP.NET(不是 MVC)——如何通过 "Request is not Available in this context."?

android-studio - 构建 Gradle 7.2 时出现问题,仍然写着找不到 Gradle 6.1.1

git - 使用 IDEA 在 git 中 merge 分支时如何使用 "No Fast Forward"标志