Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Tycho的每个测试的JVM实例-surefire_Java_Maven_Osgi_Tycho_Tycho Surefire Plugin - Fatal编程技术网

Java Tycho的每个测试的JVM实例-surefire

Java Tycho的每个测试的JVM实例-surefire,java,maven,osgi,tycho,tycho-surefire-plugin,Java,Maven,Osgi,Tycho,Tycho Surefire Plugin,长话短说,我们有一些遗留代码,由于常量的静态初始化而导致问题。我们的一些测试依赖于此,我们希望将它们隔离到单独的JVM实例中 我知道这在纯maven-surefire中是相当容易做到的 <forkCount>1</forkCount> <reuseForks>false</reuseForks> 1 假的 理论上,上述代码应该为每个测试类派生一个新线程。我认为,这应该可以解决我们的问题,因为这可能是这个测试运行到的JVM的一个新

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

我知道这在纯maven-surefire中是相当容易做到的

    <forkCount>1</forkCount>
    <reuseForks>false</reuseForks>
1
假的
理论上,上述代码应该为每个测试类派生一个新线程。我认为,这应该可以解决我们的问题,因为这可能是这个测试运行到的JVM的一个新实例,因此所有静态初始化/类加载都将再次完成

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

例如,Junit runner提供程序的并行选项如何为tycho工作

<parallel>classes</parallel>
<useUnlimitedThreads>true</useUnlimitedThreads>
类
真的
上面的代码是否会达到类似的结果?是否保证每个测试类都在自己的JVM中运行?我假设,如果我们指定无限线程,那么如果我们的并行粒度是“类”,那么线程的数量将等于测试类的数量

我希望有人能帮我解决这件事

+strong>+strong>+strong>+strong>+strong>+strong>+strong>+strong>+strong>+strong>+strong>+strong>

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

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

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

<parallel>classes</parallel>
如果设置了上述属性,JVM将启动一次,runner将生成与testsuite类数量相同的线程,并且其中的所有测试用例方法都是顺序的


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

目前没有支持分叉多个VM的Tycho版本。特性请求被跟踪为。

谢谢,我确实看到我的问题的根源在于静态方法。只是想找到一种方法来解决这个问题,而不需要做大量的代码更改。如果您正在寻找一个傻瓜式的解决方案,并且仍然希望降低测试执行时间,那么您需要摆脱静态方法。好的,我想我已经说过了。这里的目的是不接触代码。我知道摆脱静态方法可以解决这个问题。那么JVM真的会在每个插件中启动一次吗?如何在每个测试中分叉VM是一个有效的问题-但是你的“新发现”并没有澄清任何问题,反而增加了混乱。要么删除它们,要么将它们移动到答案。