每次测试的JVM实例为Tycho - surefire

时间:2014-12-12 09:50:52

标签: java maven osgi tycho tycho-surefire-plugin

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

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

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

理论上,上面的代码应为每个测试类分叉一个新线程。当我接受它时,这应该摆脱我们的问题,因为这可能是这个测试正在进入的JVM的一个新实例,因此所有静态初始化/类加载再次完成。

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

例如,Junit跑步者提供者的并行选项如何为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源代码。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

<parallel>classes</parallel>

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

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