JVM 实例每个测试的第谷 - 万无一失



长话短说,我们有一些遗留代码,由于常量的静态初始化而导致问题。我们的一些测试依赖于此,我们希望将它们隔离到单独的 JVM 实例中。

我知道这在纯粹的 maven 中很容易做到 - 万无一失

    <forkCount>1</forkCount>
    <reuseForks>false</reuseForks>

理论上,上面的代码应该为每个测试类分叉一个新线程。在我看来,这应该摆脱我们的问题,因为大概这是运行此测试的 JVM 的新实例,因此所有静态初始化/类加载都再次完成。

目前为止,一切都好。不幸的是,我们使用的是第谷万无一失 (0.16(,它似乎没有这个选项。我的问题是,是否有任何技巧可以让我们克服这个问题。

例如,Junit 运行器提供程序的并行选项如何针对第 Tycho 工作?

<parallel>classes</parallel>
<useUnlimitedThreads>true</useUnlimitedThreads>

上面的代码段会得到类似的结果吗?是否保证每个测试类都在自己的JVM中运行?我假设如果我们指定无限线程,如果我们的并行粒度为"类",线程数将等于测试类的数量。

我希望有人可以帮助我解决这个烂摊子。

++++++++++++++++++++++ 一些

新发现 +

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

有趣的是,以下选项可以解决问题。

            <threadCount>10</threadCount>
            <perCoreThreadCount>true</perCoreThreadCount>
            <parallel>classes</parallel>

我真的无法向自己解释为什么会这样。这些选项不会为每个测试类分叉单独的 JVM。它实际上在同一JVM中的单独线程中运行它。无法分叉 JVM,因为这似乎不受第谷的支持 - 万无一失。我们的主要问题源于 eclipse osgi 容器构造,它是用导致问题的静态初始化值构造的。可能是这样,当您在第谷中以这种方式并行测试时,它实际上会分叉 JVM 或执行一些奇怪的操作来重建 OSGI 容器并重新加载某些类。这可能是问题消失的原因吗?这一切似乎都很奇怪。我想我应该看一看第谷万无一失的源代码。

目前没有支持分叉多个虚拟机的第谷版本。功能请求作为错误380171进行跟踪。

我不

认为 Surefire 会在单独的 JVM 中执行每个 TestSuite 类。

<parallel>classes</parallel>

如果设置了上述属性,JVM 将启动一次,运行器将生成与测试套件类数量一样多的线程,并且其中的所有测试用例方法都是顺序的。

如果您在这种情况下使用静态的实用程序方法,则它们很可能是麻烦的根本原因:)

最新更新