JUnit 4からJUnit 5への移行
1.概要
この記事では、JUnit 4から最新のJUnit 5リリースへの移行方法について説明します。2つのバージョンのライブラリーの違いについて概説します。
JUnit 5の使用に関する一般的なガイドラインについては、私たちの記事へのリンクを見てください:/junit-5[ここ]。
2. JUnit 5の利点
以前のバージョンから始めましょう – JUnit 4には明らかな制限がいくつかあります。
-
フレームワーク全体が単一のjarライブラリに含まれていました。全体
特定の機能しかない場合でも、ライブラリをインポートする必要があります。
必須。
JUnit 5では、より細かい粒度が得られ、インポートできるものだけが取り込まれます。
必要です
** 1人のテストランナーは一度にJUnit 4のテストしか実行できません(例:
SpringJUnit4ClassRunner
または
Parameterized
)。
JUnit 5では複数が可能
同時に働くランナー
** JUnit 4はJava 7を超えて進歩したことはなく、多くの機能を見逃して
Java 8から。
JUnit 5はJava 8の機能をうまく利用する
JUnit 5の背後にある考え方は、これらの欠点のほとんどを解決するためにJUnit 4を完全に書き直すことでした。
3.違い
JUnit 4はJUnit 5を構成するモジュールに分割されました。
-
JUnitプラットフォーム –
このモジュールは私たちがすべての拡張フレームワークを対象としています
テストの実行、発見、報告に興味があるかもしれません
JUnit Vintage – ** このモジュールはJUnitとの下位互換性を保つ
4あるいはJUnit 3
3.1. アノテーション
JUnit 5では、その注釈内に重要な変更が加えられています。 ** 最も重要なのは、期待値を指定するために
@ Test
アノテーションを使用できなくなったことです。
JUnit 4の
expected
パラメーター
@Test(expected = Exception.class)
public void shouldRaiseAnException() throws Exception {
//...
}
これで、メソッド
assertThrows
を使用できます。
public void shouldRaiseAnException() throws Exception {
Assertions.assertThrows(Exception.class, () -> {
//...
});
}
JUnit 4の
timeout
属性:
@Test(timeout = 1)
public void shouldFailBecauseTimeout() throws InterruptedException {
Thread.sleep(10);
}
さて、JUnit 5の
assertTimeout
メソッドは次のとおりです。
@Test
public void shouldFailBecauseTimeout() throws InterruptedException {
Assertions.assertTimeout(Duration.ofMillis(1), () -> Thread.sleep(10));
}
JUnit 5内で変更されたその他の注釈
-
@ Before
アノテーションは
@ BeforeEach
に改名されました -
@ After
アノテーションは
@ AfterEach
に改名されました -
@ BeforeClass
アノテーションは
@ BeforeAll
に改名されました -
@ AfterClass
アノテーションは
@ AfterAll
に改名されました -
@ @無視
アノテーションは
@無効
に名前が変更されました
3.2. アサーション
JUnit 5では、アサーションメッセージをラムダに書き込むことができるようになりました。遅延評価では、必要になるまで複雑なメッセージ構成をスキップすることができます。
@Test
public void shouldFailBecauseTheNumbersAreNotEqual__lazyEvaluation() {
Assertions.assertTrue(
2 == 3,
() -> "Numbers " + 2 + " and " + 3 + " are not equal!");
}
JUnit 5ではアサーションをグループ化することもできます。
@Test
public void shouldAssertAllTheGroup() {
List<Integer> list = Arrays.asList(1, 2, 4);
Assertions.assertAll("List is not incremental",
() -> Assertions.assertEquals(list.get(0).intValue(), 1),
() -> Assertions.assertEquals(list.get(1).intValue(), 2),
() -> Assertions.assertEquals(list.get(2).intValue(), 3));
}
3.3. 仮定
新しい
Assumptions
クラスは現在
org.junit.jupiter.api.Assumptions
にあります。 JUnit 5はJUnit 4の既存の仮定メソッドを完全にサポートし、特定のシナリオでのみいくつかのアサーションを実行できるようにする一連の新しいメソッドも追加します。
@Test
public void whenEnvironmentIsWeb__thenUrlsShouldStartWithHttp() {
assumingThat("WEB".equals(System.getenv("ENV")),
() -> {
assertTrue("http".startsWith(address));
});
}
3.4. タグ付けとフィルタリング
JUnit 4では、
@ Category
アノテーションを使ってテストをグループ化することができました。
JUnit 5では、
@ Category
アノテーションは
@ Tag
アノテーションに置き換えられます。
@Tag("annotations")
@Tag("junit5")
@RunWith(JUnitPlatform.class)
public class AnnotationTestExampleTest {
/** ...** /}
maven-surefire-plugin
を使用して特定のタグを含める/除外することができます。
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<properties>
<includeTags>junit5</includeTags>
</properties>
</configuration>
</plugin>
</plugins>
</build>
3.5. テストを実行するための新しい注釈
@ RunWith
は、テストコンテキストを他のフレームワークと統合するため、またはJUnit 4のテストケースにおける全体的な実行フローを変更するために使用されました。
JUnit 5では、
@ ExtendWith
アノテーションを使用して同様の機能を提供できます。
例として、JUnit 4のSpring機能を使うには、次のようにします。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(
{"/app-config.xml", "/test-data-access-config.xml"})
public class SpringExtensionTest {
/** ...** /}
さて、JUnit 5では、これは単純な拡張です。
@ExtendWith(SpringExtension.class)
@ContextConfiguration(
{ "/app-config.xml", "/test-data-access-config.xml" })
public class SpringExtensionTest {
/** ...** /}
3.6新しいテストルールの注釈
JUnit 4では、テストに特別な機能を追加するために
@ Rule
および@
ClassRule
アノテーションが使用されました。
JUnit 5では、
@ ExtendWith
アノテーションを使って同じロジックを再現できます。
たとえば、JUnit 4にテストの前後にログトレースを書き込むためのカスタムルールがあるとします。
public class TraceUnitTestRule implements TestRule {
@Override
public Statement apply(Statement base, Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
//Before and after an evaluation tracing here
...
}
};
}
}
そしてそれをテストスイートに実装します。
@Rule
public TraceUnitTestRule traceRuleTests = new TraceUnitTestRule();
JUnit 5では、もっと直感的に同じことを書くことができます。
public class TraceUnitExtension implements AfterEachCallback, BeforeEachCallback {
@Override
public void beforeEach(TestExtensionContext context) throws Exception {
//...
}
@Override
public void afterEach(TestExtensionContext context) throws Exception {
//...
}
}
パッケージ
org.junit.jupiter.api.extensionで利用可能なJUnit 5の
AfterEachCallback
および
BeforeEachCallback__インターフェースを使用して、テストスイートにこのルールを簡単に実装します。
@RunWith(JUnitPlatform.class)
@ExtendWith(TraceUnitExtension.class)
public class RuleExampleTest {
@Test
public void whenTracingTests() {
/** ...** / }
}
3.7. JUnit 5ヴィンテージ
JUnit Vintageは、JUnit 5またはJUnit 4のテストをJUnit 5のコンテキスト内で実行することで、JUnitテストの移行を支援します。
JUnit Vintage Engineをインポートすることで使用できます。
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<version>${junit5.vintage.version}</version>
<scope>test</scope>
</dependency>
4.まとめ
この記事で見たように、JUnit 5はモジュール式で現代的なJUnit 4フレームワークです。これら2つのバージョンの主な違いを紹介し、一方から他方への移行方法を示唆しました。
このチュートリアルの完全な実装はhttps://github.com/eugenp/tutorials/tree/master/testing-modules/junit-5[GitHubに乗って]にあります。