0

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

我知道这在纯 maven 中很容易做到-surefire

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

理论上,上面的代码应该为每个测试类派生一个新线程。正如我所认为的那样,这应该可以解决我们的问题,因为大概这是该测试正在运行的 JVM 的一个新实例,因此所有静态初始化/类加载都会再次完成。

到目前为止,一切都很好。不幸的是,我们使用的是 tycho-surefire (0.16),它似乎没有这个选项。我的问题是是否有任何技巧可以让我们克服这个问题。

例如,Junit runner provider 的并行选项如何为 tycho 工作?

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

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

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

+++++++++++++++++++++++++++++++ 一些新发现++++++++++++++++++++ +++++++++++++++

有趣的是,以下选项解决了这个问题。

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

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

4

2 回答 2

1

目前还没有支持 fork 多个 VM 的 Tycho 版本。功能请求被跟踪为错误 380171

于 2014-12-12T12:41:01.300 回答
0

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

<parallel>classes</parallel>

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

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

于 2014-12-12T10:26:11.590 回答