长话短说,我们有一些遗留代码由于常量的静态初始化而导致问题。我们的一些测试依赖于此,我们希望将它们隔离到单独的 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 源代码。