当前位置: 首页 > 知识库问答 >
问题:

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

丁昌翰
2023-03-14

问题
我有一堆jUnit测试(许多具有自定义运行器,例如PowerMockRunner或JUnitParamsRunner)都在一些根包测试下(它们在测试的不同深度的不同子包中)。

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

背景< br >在我的许多测试中,我通过批注< code > @ run with(powermockrunner . class)和< code > @ PowerMockRunnerDelegate(junitparamsrunner . class)将PowerMock与JUnitParams结合使用。我有大约9000个单元测试,它们在“正常”的时间内完成,但是我有一个8核CPU,使用默认的一次一个测试的运行程序,系统的利用率严重不足。由于我经常运行测试,额外的时间越来越多,我真的想并行运行测试类。

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

我所尝试的<;br>;必须模拟静态方法,这样就不可能使用<;code>;com.googlecode.junittoolbox。ParallelSuite(这是我最初的解决方案),因为它在同一个JVM中运行所有东西,静态模拟会被交错和混乱。至少从我所犯的错误来看是这样的。

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

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

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

共有2个答案

白迪
2023-03-14

也许这在问题发布时是不可能的,但现在你可以在android studio中轻松做到。

我正在使用gradle构建工具:<code>com.android.tools.build:gradle:2.2.3‘

我在根<代码>构建中添加了以下内容。gradle文件。

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

现在,我的测试有多个<code>Gradle测试执行器</code>运行器。运行机器的核心越多,执行器越多!

感谢分享你的原答案!

费明诚
2023-03-14

我没有使用Intellij(Android Studio)内置的JUnit运行配置,而是注意到Android Studio有一堆预构建的gradle任务,其中一些涉及到测试。然而,那些表现出相同的顺序执行问题。然后,我找到了使用gradle运行并行测试任务,并将以下语句添加到我的根< code>build.gradle文件中:

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

这工作得很好,我的CPU现在与100%挂钩(对于大部分运行,因为未完成的测试类的数量变得

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

 类似资料:
  • 为了减少测试的运行时间,我希望并行运行测试。我有几个不能并行运行的类。 假设我有两种类型的类:-并行类-包含类1,类2-不并行类-包含类3,类4我想并行运行类1和类2到类3和类4(但lass3不会并行运行到类4) 我试图这样做: 我并行运行这两个测试,但只有第一个测试具有类的并行性。 如果我可以选择添加parallel=“classes”进行测试,我尝试在TestNG文档中搜索。我看不到,但它正在

  • Cucumber测试没有并行运行(Cucumber jvm并行插件)? 如果我使用runner类执行测试,一次将执行一个功能文件,但是当将以下插件添加到POM文件时,似乎没有功能文件执行? 即使我指向了正确的功能文件文件夹? 我的POM文件:

  • 问题内容: 我有大量的测试,大约需要半小时才能运行,并且希望能够并行进行测试。 有没有办法用IntelliJ IDEA 9做到这一点? 问题答案: IDEA仅从版本10开始才了解并行JUnit测试。 有一个跟踪器问题,您可以投票并等待进度:http: //youtrack.jetbrains.net/issue/IDEA-47103 我们计划将其添加到IDEA 10中,但是优先级将取决于票数。

  • 我试图用TestNG并行运行一个示例测试项目。但它是在一个线程中顺序执行的。我漏掉什么了吗? 谢了。

  • 我正在将并行执行引入我的testNG套件中。当我将“parallel”设置为“tests”时,两个浏览器打开,两个测试的第一个类同时开始--这是我所期望的。当我将其设置为“classes”时,我希望第一个测试中的两个类同时开始,但是只有一个浏览器打开,第一个类中的第一个方法执行,然后用第二个类中的第一个方法打开一个新的浏览器,依此类推。谁能告诉我我做错了什么? 下面是我的xml文件:

  • 我目前正在尝试使用Cucumber实现并行测试运行。我设法使用万无一失的插件同时运行了两个不同的运行程序。现在我想检查是否可以并行运行SingleRunner文件多次。 我有一个签名测试。所以我需要在几个平台上并行运行。有可能吗? 这是我的跑步者档案 无跑道进近 工厂级 `导入org . open QA . selenium . web driver; ` 阶梯班 导入org.openqa.sel