【问题标题】:JVM instance per test for Tycho - surefireTycho 的每个测试的 JVM 实例 - surefire
【发布时间】:2014-12-12 09:50:52
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 如何为每个测试分叉一个虚拟机的问题是一个有效的问题——但你的“新发现”并没有澄清任何事情,而是增加了混乱。删除它们或将它们移至答案。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    <parallel>classes</parallel>
    

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

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

    【讨论】:

    • 谢谢,我确实看到我的问题根源在于静态方法。只是想找一种方法来解决这个问题,而不必做很多代码更改
    • 如果您正在寻找一个万无一失的解决方案,但仍想降低测试执行时间,您需要摆脱静态方法。
    • 好吧,我想我已经说过了。这里的目的是不接触代码。我知道摆脱静态方法可以解决问题。
    • 那么每个插件会实际启动一次 JVM 吗?
    猜你喜欢
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    • 2013-07-23
    相关资源
    最近更新 更多