簡単に言えば、定数の静的初期化が原因で問題を引き起こすレガシーコードがいくつかあります。一部のテストはそれに依存しており、それらを個別の JVM インスタンスに分離したいと考えています。
これは純粋なMavenで行うのがかなり簡単であることを知っています-確実に
<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 内の個別のスレッドで実行されます。これはTychoによってサポートされていないように見えるため、JVMをフォークできません-確かに。私たちの主な問題は、問題を引き起こしている静的に初期化された値で構築された Eclipse osgi コンテナー構造に起因します。Tycho でこの方法でテストを並列処理している場合、実際に JVM をフォークするか、OSGI コンテナを再構築して特定のクラスをリロードする奇妙なことを行う場合があります。それが問題が消えた理由かもしれません。これはすべて非常に奇妙に思えます。tycho-surefire のソースコードをのぞいてみるといいと思います。