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

2024-04-06

Problem
我有一堆 junit 测试(许多带有自定义运行程序,例如 PowerMockRunner 或 JUnitParamsRunner),全部位于某个根包下tests(它们位于tests不同深度)。

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

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

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

我尝试过的
必须模拟静态方法使得不可能使用类似的东西com.googlecode.junittoolbox.ParallelSuite(这是我最初的解决方案)因为它在同一个 JVM 中运行所有内容,并且静态模拟全部交错且混乱。或者至少根据我得到的错误,在我看来是这样。

我根本不了解 JUnit 堆栈,但经过一番研究后,似乎另一个选择可能是尝试编写并注入我自己的堆栈RunnerBuilder-- 但我不确定是否可以从一个 JVM 进程中生成另一个 JVM 进程RunnerBuilder,不太可能。我认为正确的解决方案是某种作为 gradle 任务的工具。

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

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


我注意到 Android Studio 有一堆预构建 gradle 任务,其中一些涉及测试,而不是使用 Intellij (Android Studio) 内置 JUnit 运行配置。然而,这些都表现出相同的顺序执行问题。然后我发现使用 gradle 运行并行测试任务 https://stackoverflow.com/questions/23805915/run-parallel-test-task-using-gradle并将以下语句添加到我的根目录中build.gradle file:

subprojects {
    tasks.withType(Test) {
        maxParallelForks = Runtime.runtime.availableProcessors()
    }
}

这效果很好,我的 CPU 现在固定为 100%(对于大多数运行来说,随着未完成的测试类的数量变得

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐