web-dev-qa-db-ja.com

JUnit 5-IntelliJの空のテストスイートIDEA JUnitJupiterエンジンを使用する場合

IntelliJのJUnit5でAllSuiteテストを実行する方法IDEA v2016.2.2?

私はこのコードを実行して空のテストスイートを取得します:

import org.junit.platform.runner.IncludeEngines;
import org.junit.platform.runner.JUnitPlatform;
import org.junit.platform.runner.SelectPackages;
import org.junit.runner.RunWith;

@RunWith(JUnitPlatform.class)
@IncludeEngines("junit-jupiter")
@SelectPackages("<eu...package>") //I confirm that <eu...package> is ok.
public class AllTests {
}

私は受け取ります:

INFORMAZIONI: Discovered TestEngines with IDs: [junit-jupiter, junit-vintage]
Empty test suite.
Empty test suite.

[root]
JUnit Jupiter
JUnit Vintage

[〜#〜]または[〜#〜]

import eu.....services.ServiceTest;
import eu.....repository.DAOTest;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;

@RunWith(Suite.class)
@Suite.SuiteClasses({
        ServiceTest.class,
        DAOTest.class
})
public class AllTests {
}

私は受け取ります:

INFORMAZIONI: Discovered TestEngines with IDs: [junit-jupiter, junit-vintage]
Empty test suite.

[root]
|+--JUnit Vintage
|   +--eu.....AllTests
|+--JUnit Jupiter

JUnit 4でスイートを実行できましたが、JUnit5では動作しません。

8
Davideas

短い答え

IntelliJ IDEA 2016.2を使用している場合、現在、IDE内で@RunWith(JUnitPlatform.class)アノテーションが付けられたテストクラスを実行することはできません。

長い答え

あなたが報告した行動に基づいて、いくつかの骨の折れる調査作業の後、私はあなたの質問に対する答えがあると信じています...

JUnit5のサポートが組み込まれているIntelliJ IDEA 2016.2)を使用している場合、次のようになります。

  1. IDEAは、Launcher AP​​Iを介してJUnitプラットフォームを起動し、@RunWith(JUnitPlatform.class)で注釈が付けられたテストクラスを選択します(これをTestSuiteと呼びます)。
  2. Launcherは、_junit-jupiter_と_junit-vintage_ TestEngineの両方の実装を検出します。
  3. JUnit Jupiterエンジンは、技術的にはJUnit Jupiterテストクラスではないため、TestSuiteを無視します。
  4. JUnit Vintageエンジンは、@RunWith(JUnitPlatform.class)で注釈が付けられているため、TestSuiteも無視します。
  5. 最終的な結果として、登録されたテストエンジンはどちらも、TestSuiteクラスを実行できるとは主張していません。

直感的でない部分は、JUnitVintageエンジンがTestSuiteを無視することですが、実際には@RunWith()で注釈が付けられているため、JUnit4ベースのテストクラスのように見えます。無視される理由は、無限再帰を回避するためです。これは、 DefensiveAllDefaultPossibilitiesBuilder のソースコードで説明されています。

_if ("org.junit.platform.runner.JUnitPlatform".equals(runnerClass.getName())) {
    return null;
}
_

上記のコードがそのようなシナリオでnullを返すという事実は、空のスイートになります。

もちろん、ユーザーがそのようなシナリオについて知らされていれば、たとえばログステートメントを介して、確かに良いでしょう。したがって、このようなシナリオでの使いやすさを向上させるために、 JUnit 5IntelliJ の両方の問題を開きました。

プラス面として、IntelliJ IDEA 2016.2を使用しているため、テストスイートのサポートを使用する必要はありません。代わりに、で_src/test/Java_を右クリックするだけです。 IDEAのプロジェクトビューで_Run 'All Tests'_を選択すると、すべてのテストが実行されます。

よろしく、

サム(JUnit 5コアコミッター)

11
Sam Brannen

サムブランネンの答え に追加。パッケージ内のすべてのテストクラスを実行する前に、バックエンドをセットアップするためのTestSuitが必要でした。これはおそらくRun 'All Tests'では不可能です。

しかし、私はそれに対する良い回避策を見つけたと思います。私はこれを思いついた:

import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Nested;
import your.other.package.test.classes.*;

public class TestSuit {
    @BeforeAll
    public static void setup(){}

    @Nested
    public class TestExtender extends MyTestClass {}
}

各テストクラスを別のパッケージから拡張し、それに@Nestedアノテーションを追加することができます。これは最善の解決策ではありませんが、IDEAまたはJUnit5がこの場合の別の解決策を見つけるまでの回避策です。

1
Highchiller

junit公式ウェブサイト によると:

Junit-vintage-engineアーティファクトがテストランタイムパスにあることを確認してください。その場合、JUnit3およびJUnit4のテストはJUnitプラットフォームランチャーによって自動的に取得されます。
0
tnas