1. 概要

このチュートリアルでは、 Javaコードから直接JUnitテストを実行する方法を示します–このオプションが役立つシナリオがあります。

JUnitを初めて使用する場合、またはJUnit 5にアップグレードする場合は、このトピックに関する多くのチュートリアルのいくつかを確認できます。

2. Mavenの依存関係

JUnit4とJUnit5の両方のテストを実行するには、いくつかの基本的な依存関係が必要です。

<dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.8.1</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.platform</groupId>
        <artifactId>junit-platform-launcher</artifactId>
        <version>1.2.0</version>
    </dependency>
</dependencies>

// for JUnit 4
<dependency> 
    <groupId>junit</groupId> 
    <artifactId>junit</artifactId> 
    <version>4.12</version> 
    <scope>test</scope> 
</dependency>

JUnit 4、 JUnit 5 、および JUnitプラットフォームランチャーの最新バージョンは、MavenCentralにあります。

3. JUnit4テストの実行

3.1. テストシナリオ

JUnit4とJUnit5の両方について、いくつかの「プレースホルダー」テストクラスを設定します。これは、例を示すのに十分です。

public class FirstUnitTest {

    @Test
    public void whenThis_thenThat() {
        assertTrue(true);
    }

    @Test
    public void whenSomething_thenSomething() {
        assertTrue(true);
    }

    @Test
    public void whenSomethingElse_thenSomethingElse() {
        assertTrue(true);
    }
}
public class SecondUnitTest {

    @Test
    public void whenSomething_thenSomething() {
        assertTrue(true);
    }

    @Test
    public void whensomethingElse_thenSomethingElse() {
        assertTrue(true);
    }
}

JUnit 4を使用する場合、すべてのテストメソッドに@Testアノテーションを追加するテストクラスを作成します。

@Before@Afterなど、他の便利な注釈を追加することもできますが、それはこのチュートリアルの範囲外です。

3.2. 単一のテストクラスの実行

JavaコードからJUnitテストを実行するには、 JUnitCore クラスを使用できます([X95X] System.outで出力を表示するために使用されるTextListener クラスが追加されています)。 :

JUnitCore junit = new JUnitCore();
junit.addListener(new TextListener(System.out));
junit.run(FirstUnitTest.class);

コンソールに、テストが成功したことを示す非常に単純なメッセージが表示されます。

Running one test class:
..
Time: 0.019
OK (2 tests)

3.3. 複数のテストクラスの実行

でJUnit4で複数のテストクラスを指定する場合は、単一のクラスと同じコードを使用して、クラスを追加するだけです。

JUnitCore junit = new JUnitCore();
junit.addListener(new TextListener(System.out));

Result result = junit.run(
  FirstUnitTest.class, 
  SecondUnitTest.class);

resultReport(result);

結果はJUnitのインスタンスに保存されることに注意してください 結果 単純なユーティリティメソッドを使用して出力しているクラス:

public static void resultReport(Result result) {
    System.out.println("Finished. Result: Failures: " +
      result.getFailureCount() + ". Ignored: " +
      result.getIgnoreCount() + ". Tests run: " +
      result.getRunCount() + ". Time: " +
      result.getRunTime() + "ms.");
}

3.4. テストスイートの実行

いくつかのテストクラスを実行するためにグループ化する必要がある場合は、TestSuiteを作成できます。 これは、JUnitアノテーションを使用してすべてのクラスを指定する空のクラスです。

@RunWith(Suite.class)
@Suite.SuiteClasses({
  FirstUnitTest.class,
  SecondUnitTest.class
})
public class MyTestSuite {
}

これらのテストを実行するために、以前と同じコードを再度使用します。

JUnitCore junit = new JUnitCore();
junit.addListener(new TextListener(System.out));
Result result = junit.run(MyTestSuite.class);
resultReport(result);

3.5. 繰り返しテストを実行する

JUnitの興味深い機能の1つは、RepeatedTestのインスタンスを作成することでテストを繰り返すことができることです。 これは、ランダムな値をテストするとき、またはパフォーマンスチェックに非常に役立ちます。

次の例では、MergeListsTestからのテストを5回実行します。

Test test = new JUnit4TestAdapter(FirstUnitTest.class);
RepeatedTest repeatedTest = new RepeatedTest(test, 5);

JUnitCore junit = new JUnitCore();
junit.addListener(new TextListener(System.out));

junit.run(repeatedTest);

ここでは、テストクラスのラッパーとしてJUnit4TestAdapterを使用しています。

繰り返しテストを適用して、プログラムでスイートを作成することもできます。

TestSuite mySuite = new ActiveTestSuite();

JUnitCore junit = new JUnitCore();
junit.addListener(new TextListener(System.out));

mySuite.addTest(new RepeatedTest(new JUnit4TestAdapter(FirstUnitTest.class), 5));
mySuite.addTest(new RepeatedTest(new JUnit4TestAdapter(SecondUnitTest.class), 3));

junit.run(mySuite);

4. JUnit5テストの実行

4.1. テストシナリオ

JUnit 5では、前のデモと同じサンプルテストクラスFirstUnitTestSecondUnitTestを使用しますが、JUnitフレームワークのバージョンが異なるため、いくつかの小さな違いがあります。 @Testおよびアサーションメソッドのパッケージ。

4.2. 単一のテストクラスの実行

JavaコードからJUnit5テストを実行するために、LauncherDiscoveryRequestのインスタンスをセットアップします。 実行するすべてのテストクラスを取得するために、パッケージセレクターとテストクラス名フィルターを設定する必要があるビルダークラスを使用します。

次に、このリクエストはランチャーに関連付けられ、テストを実行する前に、テストプランと実行リスナーも設定します。

これらは両方とも、実行されるテストと結果に関する情報を提供します。

public class RunJUnit5TestsFromJava {
    SummaryGeneratingListener listener = new SummaryGeneratingListener();

    public void runOne() {
        LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request()
          .selectors(selectClass(FirstUnitTest.class))
          .build();
        Launcher launcher = LauncherFactory.create();
        TestPlan testPlan = launcher.discover(request);
        launcher.registerTestExecutionListeners(listener);
        launcher.execute(request);
    }
    // main method...
}

4.3. 複数のテストクラスの実行

複数のテストクラスを実行するリクエストにセレクターとフィルターを設定できます。

パッケージセレクターとテストクラス名フィルターを設定して、実行するすべてのテストクラスを取得する方法を見てみましょう。

public void runAll() {
    LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request()
      .selectors(selectPackage("com.baeldung.junit5.runfromjava"))
      .filters(includeClassNamePatterns(".*Test"))
      .build();
    Launcher launcher = LauncherFactory.create();
    TestPlan testPlan = launcher.discover(request);
    launcher.registerTestExecutionListeners(listener);
    launcher.execute(request);
}

4.4. テスト出力

main()メソッドでは、クラスを呼び出し、リスナーを使用して結果の詳細を取得します。 今回は、結果がTestExecutionSummaryとして保存されます。

その情報を抽出する最も簡単な方法は、コンソール出力ストリームに出力することです。

public static void main(String[] args) {
    RunJUnit5TestsFromJava runner = new RunJUnit5TestsFromJava();
    runner.runAll();

    TestExecutionSummary summary = runner.listener.getSummary();
    summary.printTo(new PrintWriter(System.out));
}

これにより、テスト実行の詳細がわかります。

Test run finished after 177 ms
[         7 containers found      ]
[         0 containers skipped    ]
[         7 containers started    ]
[         0 containers aborted    ]
[         7 containers successful ]
[         0 containers failed     ]
[        10 tests found           ]
[         0 tests skipped         ]
[        10 tests started         ]
[         0 tests aborted         ]
[        10 tests successful      ]
[         0 tests failed          ]

5. 結論

この記事では、JavaコードからプログラムでJUnitテストを実行する方法を示し、JUnit4とこのテストフレームワークの最近のJUnit5バージョンについて説明しました。

いつものように、ここに示されている例の実装は、JUnit5の例JUnit4の両方のGitHubで利用できます。