web-dev-qa-db-ja.com

JUnitとSurefireの並列テスト-ForkCountとThreadCount

Surefireプラグインを使用してSelenium GridでSeleniumテストを実行し、テストを実行しています。私のテストの内訳に関して、私はいくつかのクラスを持っています。そのうちのいくつかはそこに1つのテストがあり、いくつかは複数のテストがあります。

したがって、私のグリッドには30 chrome Webドライバーがあり、すべてのクラス内のすべてのテストを並行して実行したいと考えています。

私が設定したparallelパラメータを使用してこれを行う方法を読みました:

            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.17</version>
                <configuration>
                    <includes>
                        <include>${testSuite}</include>
                    </includes>
                    <parallel>all</parallel>
                    <useSystemClassLoader>false</useSystemClassLoader>
                    <perCoreThreadCount>false</perCoreThreadCount>
                    <threadCount>20</threadCount>
                    <browser>${browser_type}</browser>
                </configuration>
            </plugin>

しかし、これは私が利用できるすべてのChrome Webドライバーを満たしているようではありません。

もし私がそれならforkCountを使う:

<forkCount>20</forkCount>
<reuseForks>true</reuseForks>

その後、テストの実行が最初に開始されると、すべてのWebドライバーが満たされますが、すぐに1つずつドロップして動作し始めます。

だから私の質問:

  • ForkCountとthreadCountの間に関係はありますか
  • これを実際に並行して実行するために必要な追加事項はありますか?

ありがとう。

12
userMod2

明示的なjunitテストプロバイダーを提供する必要があります。

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.18.1</version>
    <dependencies>
        <dependency>
            <groupId>org.Apache.maven.surefire</groupId>
            <artifactId>surefire-junit47</artifactId>
            <version>2.18.1</version>
        </dependency>
    </dependencies>
    <configuration>
        <parallel>all</parallel>
        <useUnlimitedThreads>true</useUnlimitedThreads>
        <useSystemClassLoader>false</useSystemClassLoader>
        <includes>
            <include>${testSuite}</include>
        </includes>
        <systemPropertyVariables>
            <browser>${browser_type}</browser>
        </systemPropertyVariables>
     </configuration>
</plugin>

また、古いバージョンでは並列テストが正しく機能しないため、JUnit 4.7以降を使用する必要があります。

また、テストがJVMランタイムに影響を与えない場合は、フォーク関連のパラメーターを省略できます(通常はそうではありません)。

または、テストをTestNGに移行します。これはよりエレガントなフレームワークであり、JUnit(imo)よりもはるかに優れた並列テストで動作します。

4
ursa

テストを並行して実行するための非常に多くの構成があります。

ドキュメントによると:

forkCount

パラメータforkCountは、テストを実行するためにSurefireが同時に生成するJVMプロセスの最大数を定義します。これは、maven-coreの-Tと同じ構文をサポートします。値をCで終了すると、その値はシステムで使用可能なCPUコアの数で乗算されます。たとえば、クアッドコアシステムでforkCount=2.5Cを使用すると、テストを実行する最大10個の同時JVMプロセスがフォークされます。

...

デフォルト設定はforkCount=1/reuseForks=trueです。これは、Surefireが1つの新しいJVMプロセスを作成して、1つのMavenモジュールですべてのテストを実行することを意味します。

threadCount

reuseForks=trueと1より大きいforkCount値を使用すると、テストクラスはフォークされたプロセスに1つずつ渡されます。したがって、parallel=classesは何も変更しません。ただし、parallel=methodsを使用できます。クラスはforkCount並行プロセスで実行され、各プロセスはthreadCountスレッドを使用して1つのクラスのメソッドを並列に実行できます。

私が理解しているように、threadCountは各フォークのサブスレッドのようなものです。

これらのパラメータを微調整して、テストのパフォーマンスを向上させることができます。たとえば、次のようにすることができます。

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.17</version>
    <configuration>
         <includes>
              <include>${testSuite}</include>
         </includes>
         <parallel>all</parallel>
         <useSystemClassLoader>false</useSystemClassLoader>
         <perCoreThreadCount>false</perCoreThreadCount>
         <forkCount>2.0C</forkCount>
         <reuseForks>true</reuseForks>
         <threadCount>20</threadCount>
         <browser>${browser_type}</browser>
    </configuration>
</plugin>

あなたはそのサイトで詳細を見つけることができます:

https://maven.Apache.org/surefire/maven-surefire-plugin/examples/fork-options-and-parallel-execution.html

2
Federico Piazza