web-dev-qa-db-ja.com

同じビルドでJUnit 4およびJUnit 5テストを実行する

Mavenプロジェクトでは、JUnit 4に依存する既存のテストがいくつかあります。これらのテストをJUnit 5に移行する理由はいくつかあります。
本質的に、一部のテストはJUnit 4ランナーを使用するライブラリに依存しており、コードの移行には時間がかかる場合があります。

今でもリリースされ、新しい興味深い機能を提供するJUnit 5を使用して、新しいテストクラスを作成します。
どうやってするか ?

23
davidxxx

JUnit 5は、 すぐに使える方法 を提供します。

JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage

それぞれが個別のプロジェクトであり、それらをすべて使用すると、同じプロジェクトでJUnit 4およびJUnit 5テストをコンパイルして実行できます。

JUnit Jupiterは、JUnit 5でテストと拡張機能を記述するための新しいプログラミングモデルと拡張モデルの組み合わせです。

JUnit Vintageは、プラットフォームでJUnit 3およびJUnit 4ベースのテストを実行するためのTestEngineを提供します。

JUnitプラットフォームは、JVMでテストフレームワークを起動するための基盤として機能します


更新:Maven Surefireから2.22.0

JUnit 5ドキュメント から:

バージョン2.22.0から、Maven SurefireはJUnitプラットフォームでテストを実行するためのネイティブサポートを提供します。

したがって、構成ははるかに簡単です。
junit-4 api依存関係はオプションであることに注意してください。これは、現在必要なengine依存関係が既にデフォルトのapiバージョンをプルしているためです(両方のjunit 4および5)。

サンプルpom.xmlは次のとおりです。

<project xmlns="http://maven.Apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>david</groupId>
    <artifactId>jupiter-4-and-5-same-build</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <junit-jupiter.version>5.1.0</junit-jupiter.version>
        <!-- optional : if we want to use a junit4 specific version -->
        <junit.version>4.12</junit.version>
    </properties>
    <dependencies>
        <!--JUnit Jupiter Engine to depend on the JUnit5 engine and JUnit 5 API -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit-jupiter.version}</version>
            <scope>test</scope>
        </dependency>
        <!--JUnit Jupiter Engine to depend on the JUnit4 engine and JUnit 4 API  -->
        <dependency>
            <groupId>org.junit.vintage</groupId>
            <artifactId>junit-vintage-engine</artifactId>
            <version>${junit-jupiter.version}</version>
        </dependency>
        <!-- Optional : override the JUnit 4 API version provided by junit-vintage-engine -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.0</version>
            </plugin>
        </plugins>
    </build>

</project>

私のGitHubスペースに、参照/複製できる作業用のサンプルMavenプロジェクトを追加しました。 URL: https://github.com/ebundy/junit4-and-5-minimal-maven-project


古い方法:Maven Surefireの下2.22.0

JUnit4とJUnit5の両方のテストをコンパイルして実行するようにプロジェクトを構成するためにMavenで使用する最小限の構成を次に示します。

<project xmlns="http://maven.Apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>mygroup</groupId>
    <artifactId>minimal-conf-junit4-5</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <properties>
        <!-- JUnit 5 depends on JDK 1.8 -->
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <!--  JUnit dependency versions -->
        <junit.version>4.12</junit.version>
        <junit-vintage-engine>4.12.1</junit-vintage-engine>
        <junit-jupiter.version>5.0.1</junit-jupiter.version>
        <junit-platform.version>1.0.1</junit-platform.version>
    </properties>

    <dependencies>
        <!--JUnit Jupiter API to write and compile tests with JUnit5 -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>${junit-jupiter.version}</version>
            <scope>test</scope>
        </dependency>
        <!-- JUnit 4 to make legacy JUnit 4 tests compile -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.19.1</version> <!-- matters until now-->
                <dependencies>
                    <!-- to let surefire to run JUnit 4 but also JUnit 5 tests -->
                    <dependency>
                        <groupId>org.junit.platform</groupId>
                        <artifactId>junit-platform-surefire-provider</artifactId>
                        <version>${junit-platform.version}</version>
                    </dependency>
                    <!-- JUnit vintage engine to run JUnit 3 or JUnit 4 tests -->
                    <dependency>
                        <groupId>org.junit.vintage</groupId>
                        <artifactId>junit-vintage-engine</artifactId>
                        <version>${junit-vintage-engine}</version>
                    </dependency>
                    <!-- JUnit 5 engine to run JUnit 5 tests -->
                    <dependency>
                        <groupId>org.junit.jupiter</groupId>
                        <artifactId>junit-jupiter-engine</artifactId>
                        <version>${junit-jupiter.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
</project>

mvn testは、JUnit 4とJUnit 5の両方のテストをコンパイルして実行します。

注1:junit-vintage-engine4.12.1)およびjunit4.12)依存関係は、まったく同じバージョンを指定しません。
これはまったく問題ではありません。

  • それらのリリースはそれらの間で関係ありません

  • junit-vintage-engineは、任意のJUnit3または4を実行するように設計されていますテスト。

注2:2.19.1バージョンのmaven-surefire-pluginは、JUnit 5テストクラス、またはJUnit 4とJUnit 5テストクラスの両方をコンパイルする場合に重要です。
プラグインの次のバージョンでは、実際にJUnit 5テストの実行中にいくつかの例外が発生しますが、最後に問題を解決する2.22.0(回答の最初の部分を参照してください: "Update :Maven Surefire 2.22.0 "から)。

35
davidxxx