JavaアプリケーションからプログラムでJUnitテストを実行する

1概要

このチュートリアルでは、Javaコードから直接JUnitテストを実行する方法を説明します。

あなたがJUnitに不慣れであるか、またはあなたがJUnit 5にアップグレードしたいならば、あなたはhttps://www.baeldung.com/junit[多くのチュートリアル]のいくつかをチェックすることができます。

2 Mavenの依存関係

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

<dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.2.0</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、 https://searchの最新バージョン.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.junit.jupiter%22%20AND%20a%3A%22junit-jupiter-engine%22[JUnit 5]、およびhttps://検索.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.junit.platform%22%20AND%20a%3A%22junit-platform-launcher%22[JUnitプラットフォームランチャー]はMaven Centralで見つけることができます。

3 JUnit 4テストを実行する

3.1. テストシナリオ

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

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 クラスを使用できます( TextListener クラスを追加し、 System.out に出力を表示するために使用)

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. 複数のテストクラスを実行する

JUnit 4で 複数のテストクラスを 指定する場合は、単一のクラスと同じコードを使用して、単純に追加のクラスを追加することができます。

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

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

resultReport(result);

結果

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 JUnit 5テストを実行する

4.1. テストシナリオ

JUnit 5では、以前のデモと同じサンプルテストクラス FirstUnitTest SecondUnitTest を使用します。ただし、 @ Test とアサーションメソッドのパッケージのように、JUnitフレームワークのバージョンが異なるため、若干の違いがあります。

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

JavaコードからJUnit 5のテストを実行するために、 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結論**

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

いつものように、ここに示されている例の実装はGitHubでhttps://github.com/eugenp/tutorials/tree/master/testing-modules/junit-5[JUnit 5の例]の両方で利用可能です。 https://github.com/eugenp/tutorials/tree/master/testing-modules/testing[JUnit 4]。