JavaアプリケーションからプログラムでJUnitテストを実行する
1. 概要
このチュートリアルでは、how to run JUnit tests directly from Java codeを示します。このオプションが役立つシナリオがいくつかあります。
JUnitを初めて使用する場合、またはJUnit 5にアップグレードする場合は、このトピックに関するmany tutorialsのいくつかを確認できます。
2. Mavenの依存関係
JUnit4とJUnit5の両方のテストを実行するには、いくつかの基本的な依存関係が必要です。
org.junit.jupiter
junit-jupiter-engine
5.2.0
test
org.junit.platform
junit-platform-launcher
1.2.0
// for JUnit 4
junit
junit
4.12
test
JUnit 4,JUnit 5およびJUnit Platform Launcherの最新バージョンは、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クラスを使用できます(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. 複数のテストクラスの実行
JUnit 4でto specify multiple test classesが必要な場合は、単一のクラスの場合と同じコードを使用して、クラスを追加するだけです。
JUnitCore junit = new JUnitCore();
junit.addListener(new TextListener(System.out));
Result result = junit.run(
FirstUnitTest.class,
SecondUnitTest.class);
resultReport(result);
結果はJUnitの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つは、repeat tests by creating instances of 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では、前のデモと同じサンプルテストクラス(FirstUnitTestとSecondUnitTest)を使用しますが、%(のパッケージなど、JUnitフレームワークのバージョンが異なるために若干の違いがあります。 t2)sおよびアサーションメソッド。
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.example.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バージョンについて説明しました。
いつものように、ここに示す例の実装は、JUnit 5 examplesとJUnit 4の両方でGitHubから入手できます。