BullよりElk

洋服と食をこよなく愛するWebプログラマ。

JUnit5試したみた #3(ParameterizedTest)

前回に引き続き、JUnit5について書きます。2018年1月15日に5.0.3がリリースされましたね。今回は、ParameterizedTestについてです。
元のソースコードGitHubにおいてあります。
github.com

ParameterizedTest

ParameterizedTestは、指定した引数を用いて、複数回テストを実行することができます。同じテストだけど、引数だけが違うというときに使えます!
引数のタイプを指定できるアノテーションは、以下の6つです。
@ValueSource、@EnumSource、@MethodSource、@CsvSource、@CsvFileSource、@ArgumentSource
詳しくは、後ほど説明します。

@ValueSource

@ValueSourceは、最もシンプルに引数のタイプを指定できます。
@ValueSourceで指定できる型は、String、int、long、doubleの配列です。配列の前から順番にテストします。
以下がStringの配列を指定したときの例です。int、long、doubleのときも同様です。

テスト対象クラス

テストクラス


実行結果

f:id:b1a9id:20180118101714p:plain

@EnumSource

@EnumSourceで指定できる属性は、value、names、modeがあります。配列の前から順番にテストします。

属性 説明
value Enumのタイプを指定する。
names Valueで指定したEnumのタイプの特定の値をStringの配列で指定する(正規表現も使用可能)。これらの値をテストでどういう扱いにするかをmodeで指定する。
mode EnumSource.Modeのどれか(EXCLUDE, INCLUDE, MATCH_ALL, MATCH_ANY)を指定する。

EnumSource.Modeの説明

説明
EXCLUDE namesで指定した値を除外して抽出する。
INCLUDE namesで指定した値のみ抽出する。namesのデフォルトはこれです。
MATCH_ALL namesで正規表現を指定した場合にすべてに当てはまる値のみ抽出する。
MATCH_ANY namesで正規表現を指定した場合にどれかに当てはまる値のみ抽出する。

なお、namesを未指定でMATCH_ALLまたはMATCH_ANYを指定した場合は、すべての値を抽出します。

テスト対象のEnum

テストクラス


@CsvSource

@CsvSourceで指定できる型は、カンマ区切り文字列の配列です。配列の前から順番にテストします。
説明があまりうまくできていない気がするのでサンプルみてみましょうw
ちなみに指定の仕方は、JUnit 5 User Guideに詳しく書いてあるのでこちらを参照していただければと思います。

テストクラス


実行結果

f:id:b1a9id:20180118145219p:plain

@CsvFileSource

@CsvSourceとほぼ同様ですが、こちらは、ファイルから読み込むことができます。

テスト対象CSV

テストクラス


実行結果

f:id:b1a9id:20180118150155p:plain

解説

ちなみに、@CsvFileSourceは、ファイルの文字コード、改行文字、区切り文字を指定できるようです。(区切り文字は、@CsvSourceでも指定できます。)
区切り文字に「・」を指定して実行してみましたが、表示するメッセージはcsv用になっていました。まあ、アノテーションにもCsvとついていますし、区切り文字は指定しない方がいいかもしれませんね。

@MethodSource

@MethodSourceは、自分で実装した指定したい型のSteramまたはIterableまたはIteratorまたは配列を返すメソッドをStringの配列で指定します。

メソッドの引数が1つのときの、テストクラス

methodSourceIntStreamメソッドの実行結果

f:id:b1a9id:20180118152736p:plain

methodSourceStreamメソッドの実行結果

f:id:b1a9id:20180118152802p:plain

メソッドの引数が2つのときの、テストクラス

実行結果

f:id:b1a9id:20180118153322p:plain

解説

メソッドで複数の引数を指定したい場合は、ArgumentインターフェースのCollectionかStreamを返す必要があります。

@ArgumentsSource

上で紹介したものは全てArgumentsProviderインターフェースを実装したクラスを呼んでいます。
f:id:b1a9id:20180118155745p:plain
つまり、再利用可能なArgumentsProviderを実装して、値を自由に指定しようということです。

テストクラス

実行結果

f:id:b1a9id:20180118162125p:plain

おまけ(表示するメッセージをカスタマイズする)

@ParameterizedTestのname属性を指定することで、表示するメッセージをカスタマイズできます。

サンプルコード

実行結果

f:id:b1a9id:20180118163135p:plain

解説

次のプレースホルダが使えます。

プレースホルダ 説明
{index} 現在の呼び出し回数
{arguments} メソッドの引数のリスト(カンマ区切りで表示される)
{0}, {1},... 個々の引数

以上です。次はDynamicTestとか紹介できたらいいかなと思います。