web-dev-qa-db-ja.com

テストはJUnit4で実行されますが、JUnit 5では実行されません—クリーンにコンパイルされますが、0個のテストが実行されます

誰でもこの問題を数分で簡単に再現できます。

基本的なMavenquickstartプロジェクト

IntelliJ2018.3とMaven3.6.0では、Mavenアーキタイプを使用してまったく新しいプロジェクトを作成します maven-archetype-quickstart バージョン1.4。

enter image description here

Java 11

新しいプロジェクトのPOMファイルで、maven.compiler.sourcemaven.compiler.targetのプロパティを1.7から11に変更します。Java 11.0.2現在使用しています、- Zul from Azul Systems

<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <maven.compiler.source>11</maven.compiler.source>
  <maven.compiler.target>11</maven.compiler.target>
</properties>

IntelliJのMavenパネルで、cleanおよびinstallライフサイクルイベントを実行します。

enter image description here

JUnit4でテストを実行

installの一部として、テストが実行されます。このquickstartアーキタイプには、trueをアサートする単一のテストが付属しています。

enter image description here

結果はIntelliJのRunパネルに表示されます。

[情報] work.basil.example.AppTestを実行しています

[情報]テストの実行:1、失敗:0、エラー:0、スキップ:0、経過時間:0.026秒-work.basil.example.AppTest内

だから私はテストが実行されたことを知っています。

4ではなくJUnit5

これはすべて良いです。それでは、JUnit 5にアップグレードして、問題を確認しましょう。

POMで、JUnitの依存関係を次のように変更します。

<dependencies>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
  </dependency>
</dependencies>

…これに:

<dependencies>
  <!--JUnit 5-->
  <dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.3.2</version>
    <scope>test</scope>
  </dependency>
</dependencies>

木星の輸入(ビンテージテストなし)

コンパイラは私のAppTest.Javaファイルについて文句を言います。そこで、そこでimportステートメントを変更して、jupiterパッケージを使用します。新しいgreedfieldプロジェクトでJUnit5テストのみを実行したいので、ビンテージのJUnit4テストは必要ありません。したがって、インポートはこれから変更されます。

import static org.junit.Assert.assertTrue;
import org.junit.Test;

…これに:

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertTrue;

次に、Maven> Lifecycle> cleaninstallを実行します。

…そして、問題:私たちのテストは実行されません。 IntelliJのRunパネルに表示されるレポート:

[情報] work.basil.example.AppTestを実行しています

[情報]テストの実行:0、失敗:0、エラー:0、スキップ:0、経過時間:0.003秒-work.basil.example.AppTest内

➥JUnit5が、JUnit4が正常に実行したのとまったく同じテストを実行できないのはなぜですか。

surefireプラグインを更新します

Maven Surefireプラグイン を更新する必要があると思います。したがって、POMでこれを変更します。

<plugin>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.22.1</version>
</plugin>

…これに:

<plugin>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>3.0.0-M3</version>
</plugin>

別のcleaninstall。しかし、それ以上に、0個のテストを実行します。

[情報] work.basil.example.AppTestを実行しています

[情報]テストの実行:0、失敗:0、エラー:0、スキップ:0、経過時間:0.004秒-work.basil.example.AppTest内

POM全体

これが私のPOMファイル全体です。

<?xml version="1.0" encoding="UTF-8"?>

<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>work.basil.example</groupId>
  <artifactId>tester</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>tester</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
  </properties>

  <dependencies>
    <!--JUnit 5-->
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-api</artifactId>
      <version>5.3.2</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <!-- clean lifecycle, see https://maven.Apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- default lifecycle, jar packaging: see https://maven.Apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>3.0.0-M3</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
        <!-- site lifecycle, see https://maven.Apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
        <plugin>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.7.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-project-info-reports-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

JUnitライブラリ

Maven cleaninstallを実行すると、junit-jupiter-apijunit-platform-commonsの2つのJUnitライブラリが表示されます。

enter image description here

JUnit5の他のバージョン

junit-jupiter-api依存関係で次のバージョンを試しました。

  • 5.0.0-M1
  • 5.1.1
  • 5.3.0
  • 5.3.2
  • 5.4.0-M1

試行するたびに、Maven cleaninstallを実行しました。良くない。それらの各バージョンはTests run: 0を報告しました。

maven-archetype-quickstartのせいにしないでください

私は実際に、まったく異なるMavenアーキタイプを使用した非常に異なるプロジェクトでこの問題を発見しました。

このバグのあるJUnit5の動作を突き止めるために、非常に単純なmaven-archetype-quickstartを使用して新しい新しいプロジェクトを試しました。私はまったく同じ動作を見つけました。すべてがコンパイルされ、テストハーネスが実行されますが、JUnit5ではテストが実行されません。

10
Basil Bourque

tl; dr

JUnit 5バージョン5.4.0-M1以降の場合、POMで新しい単一のMavenアーティファクト junit-jupiter “ Aggregator”を指定します。

<!--JUnit 5-->
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter -->
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>5.4.0-M1</version>
</dependency>

以前のバージョンでは、少なくとも次の2つのアーティファクトを指定します: junit-jupiter-apijunit-jupiter-engine

JUnit5は複数のテストフレームワークをヨークします

私が収集できることから、JUnit 5は、複数のテストフレームワークのヨークとして再設計されました。これらのテストシステムには、JUnit 4の「ビンテージ」テスト、新しいJUnit 5テスト(新しいアノテーションとメソッドを使用したテストの新しい構文)、および SpecsySpek などが含まれます。 、 Cucumber 、Droolsシナリオ、 jqwik 、および 実装するものが多いTestEngine インターフェイス。

どうやらjunit-jupiter-apiアーティファクトは外側のヨークだけです。また、実際にテストを実行するには、1つ以上の TestEngine 実装を指定する必要があります。たとえば、ビンテージのJUnit 4テストを実行するには、 VintageTestEngine 実装が必要です。また、JUNit 5テストを実行するには、 JupiterTestEngine が必要です。 =実装。

したがって、JUnit 5テストを実行するには、MavenPOMでjunit-jupiter-engineアーティファクトを使用してJupiterTestEngine実装を指定する必要があります。

JUnit 5のマニュアル、特にセクション テストエンジンの設定 を参照してください。

Marc Philippによる このプレゼンテーション を参照してください。図は、(A)IDE /ビルドツールのコアと(B)テストを作成するプログラマー向けのプラグ可能なテスト作成フレームワークを備えたプラットフォームとしてのJUnit5を示しています。

junit-jupiter-engine

このサンプル に見られるように、 JUNit Jupiter Engine の2番目のJUnit関連の依存関係を追加します。 このアーティファクトのドキュメント は、「JUnit Jupiterテストエンジンの実装、実行時にのみ必要」と簡単に述べています。

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>5.4.0-M1</version>
    <scope>test</scope>
</dependency>

質問に示されているプロジェクトにその1つの依存関係を追加するだけで、テストが実行されます。

[情報] work.basil.example.AppTestを実行しています

[情報]テストの実行:1、失敗:0、エラー:0、スキップ:0、経過時間:0.004秒-work.basil.example.AppTest内


junit-jupiter-params

同じサンプルは、 JUnit Jupiter Params の3番目のJUnit依存関係も示しています。サンプルのテストを実行する必要はありませんが、他の目的に役立つ場合があります。どうやら パラメータ化されたテスト に関連しています。

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-params</artifactId>
    <version>5.4.0-M1</version>
    <scope>test</scope>
</dependency>

これにより、合計3つのJUnit依存関係が作成されます。

<!--JUnit 5-->
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.4.0-M1</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-params</artifactId>
    <version>5.4.0-M1</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>5.4.0-M1</version>
    <scope>test</scope>
</dependency>

同じPOMファイルが、これら3つのJUnit依存関係すべてに更新されました。

<?xml version="1.0" encoding="UTF-8"?>

<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>work.basil.example</groupId>
    <artifactId>tester</artifactId>
    <version>1.0-SNAPSHOT</version>

    <name>tester</name>
    <!-- FIXME change it to the project's website -->
    <url>http://www.example.com</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <dependencies>

        <!--JUnit 5-->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.4.0-M1</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-params</artifactId>
            <version>5.4.0-M1</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.4.0-M1</version>
            <scope>test</scope>
        </dependency>

    </dependencies>

    <build>
        <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
            <plugins>
                <!-- clean lifecycle, see https://maven.Apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
                <plugin>
                    <artifactId>maven-clean-plugin</artifactId>
                    <version>3.1.0</version>
                </plugin>
                <!-- default lifecycle, jar packaging: see https://maven.Apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
                <plugin>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>3.0.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.0</version>
                </plugin>
                <plugin>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>3.0.0-M3</version>
                </plugin>
                <plugin>
                    <artifactId>maven-jar-plugin</artifactId>
                    <version>3.0.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-install-plugin</artifactId>
                    <version>2.5.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-deploy-plugin</artifactId>
                    <version>2.8.2</version>
                </plugin>
                <!-- site lifecycle, see https://maven.Apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
                <plugin>
                    <artifactId>maven-site-plugin</artifactId>
                    <version>3.7.1</version>
                </plugin>
                <plugin>
                    <artifactId>maven-project-info-reports-plugin</artifactId>
                    <version>3.0.0</version>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

junit-jupiterアーティファクト

JUnit 5のバージョン5.4.0は、新しいMavenアーティファクト junit-jupiter タイトルJUnit Jupiter(Aggregator)をもたらします。 「アグリゲーター*」という言葉は、プログラミングの便宜のために、Mavenで一般的に使用されるJUnit5アーティファクトのいくつかをバンドルすることを指しているようです。

この1つのdependencyをPOMに追加すると、プロジェクトに8つのライブラリが追加されます。

<!--JUnit 5-->
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter -->
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>5.4.0-M1</version>
</dependency>

Screenshot of IntelliJ panes for project structure and POM file contents, where a single dependency for <code>junit-jupiter</code> adds eight libraries to your project, all you need to run JUnit 5 tests.

5
Basil Bourque