JUnit5が9/10にリリースされました。リリースからちょっと時間が経ってしましましたが、JUnit5について書きたいと思います。
What' new JUnit5?
大きな違いと言えば、3つの異なるサブプロジェクトから構成されていることです。以前のバージョンまでは、1プロジェクトで構成されていました。
つまり、こういうことです。
JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage( JUnit 5 User Guide より)
各プロジェクトの役割について簡単に説明します。
JUnit Jupiter
プラットフォーム上でJupiterベースのテストを動かすためのテストエンジンを提供します。
JUnit Vintage
プラットフォーム上でJUnit3やJUnit4ベースのテストを動かすためのテストエンジンを提供します。
JUnit5の導入
pom.xmlにこれらを追加してください。なお、JUnit5を動かすためには、Java8以上である必要があります。
それぞれの説明は JUnit 5 User Guide に書いてあります。
pom.xml
一般的なテスト
サンプルコードです。
StandardTest.java
アノテーションの説明
テストを書く上で、よく使うアノテーションについて説明します。
@DisplayName
テストクラスやメソッドにつけることができるアノテーションです。
テストランナーやテストレポートが引数で指定した値を表示してくれます。文字列、空白、絵文字などを使うことができます。
@BeforeAll
JUnit4でいうところの@BeforeClassです。
全ての@Test, @RepeatedTest, @ParameterizedTest, and @TestFactory テスト実行前に1度だけ実行されます。
@BeforeEach
JUnit4でいうところの@Beforeです。
@Test, @RepeatedTest, @ParameterizedTest, and @TestFactory 各テスト実行前に実行されます。
@Disabled
JUnit4でいうところの@Ignoreです。
これをつけたテストクラス及びメソッドは実行されません。
実行結果
IntelliJ IDEAで実行しています。
@DisplayNameの表示
@DisplayNameで指定した値が表示されていることがわかります。今まではコメントとしてどういったテストか書いていたのでありがたいです。
結果出力
@BeforeAllがクラス内で1度だけ、@BeforeEachが各テスト前に実行されていることがわかります。
executed before all test just once. executed before each test. This is test1. This is Disabled test. executed before each test. This is test3.
基本的なアサーションの紹介
サンプルコードです。
基本的にはJavaDocを読めば理解できると思います。
StandardAssertionTest.java
Assertions#assertAll
第1引数で指定している値は、テスト失敗時にメッセージに含みたい値になります。
DependentAssertions#nameAssertionsの失敗例です。
org.opentest4j.MultipleFailuresError: This is name test. (1 failure) expected: <Ryo> but was: <Ryosuke>
Assertions#fail
AssertionFailedErrorを投げて必ずテストを失敗させる。値を返す前に例外を投げる。AssertJのassertThatThrowByを使ってたら使い道なさそう...
例外発生を期待するケースで、「例外なしでこのパスに来ちゃダメ」ということを表すのに使ってました。assertThatThrownByのようなものがある場合は、使い道がないかもしれません。
— 宮川 拓⚑ (@miyakawa_taku) 2017年12月26日
Assumption
Assumption#assumeTrueとかの結果がTrueだったら、それ以降に書いた検証を実行します。厳密には、TestAbortedExceptionを投げてテストを中断させています。
AssumptionAssertions#invalidTestでAssumption#assumeFalseの第2引数に渡した「() -> "This is invalid."」は、テストが中断したときにメッセージに含みたい値になります。
org.opentest4j.TestAbortedException: Assumption failed: This is invalid.
実行結果
AssumptionAssertionsクラスで中断されたテストは結果に出力されていないことがわかると思います。中断されたことは、ログに出力されます。
今回は、JUnit5の導入的なところ触れてみました。次回は実用的なテストを書こうと思います。
ちなみに使用したサンプルコードはこちらにあります。
github.com