【JUnit5】ParameterizedTestの書き方まとめ(ValueSource、CsvSource、EnumSource、MethodSource)

当ページのリンクには広告が含まれています。
エンジニア, パソコン, ノマド
目次

概要

1つのテストに複数のデータを適用したいときにはパラメータ化テストが有効です。
ここでは様々なパラメータ化テストを利用シーンに合わせて解説していきます。

パラメータ化テストを実装する時は、@ParameterizedTestをテストメソッドに付与します。

準備

パラメータ化テストを実装するには、junit-jupiter-paramsの依存関係を追加する必要があります。
そのため、build.gradleに以下を追加します。
https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-params

単一データ

テストデータとして単一なものを扱います。

@ValueSource

StringやIntegerといったリテラル値を配列で与えることができます。

String型のテスト
@ValueSourceにstringsを引数名して、値は配列で与えます。

実行結果
テストデータの結果が成功か失敗かを各テスト毎に確認することができます。
※成功した結果をIntelliJで確認する場合、画像左上の☑マークをONにすること。

他の型について
String以外のオプションは下記ドキュメントの「Optional Element Summary」に一覧化されています。
Annotation Type ValueSource

Class型のテスト
StringやIntegerは簡単ですが、Class型はどう扱うかのか私はピンときませんでした。
なので少し調べたところ、簡単な例があったので紹介します。
Class型のテストはあまり使う機会はないと思いますが、こういった使い方なのだということがわかっておけばいいかなと思います。

参考
What is the use of @ValueSource(classes= …..)

複数データ

複数のデータをテストデータとして扱います。
また、引数に与えるデータは暗黙的に型変換されます。(2.15.4. Argument Conversion

@CsvSource

テストデータは基本的にCSVで与えますが、カンマ以外を区切り文字にするオプションなども用意されています。

※テストデータのみであればオプション名[value]は省略できます。
しかし、他のオプション(delimiterString等)を使用した場合、[value]は明示的に指定する必要があります。

@CsvFileSource

CSVファイルをテストデータとして使うことができます。

add.csv
データ

配置先(src/test/resources/add.csv)

テストコード
テストファイルの配置先を指定するオプションに、resourcesまたはfilesのいずれかを指定できます。
パスの指定方法が異なるので以下を参考にして下さい。
・resources:resourcesディレクトリ配下にある想定でパスを指定
・files :プロジェクト直下にある想定でパスを指定

@CsvSourceと同様にdelimiterまたはdelimiterStringで区切り文字を指定できるので、TSVのテストも可能です。

Enum

Enum定義をテストするためのテストデータを提供するアノテーションです。

@EnumSource

基本的な使い方は以下のようなパターンです。

引数パラメータ
value:Enumのクラスを指定します。
mode:namesで指定する値または正規表現の条件を指定します。
指定方法は以下の4つが可能です。
・MATCH_ANY(部分一致)
・MATCH_ALL(完全一致)
・INCLUDE(含む)
・EXCLUDE(含まない)
names:Enumの値または正規表現を指定します。

ファクトリメソッドによる指定

MethodSourceで注意すべき点は以下の2つです。
・戻り値はStreamとする。
・定義するメソッドはstaticとする。

@MethodSource

単一の値を扱う場合
単純なintやStringの値をテストデータにする場合は、CsvSourceまたはValueSourceで十分です。
もしMethodSourceを使うのであれば、リテラル値でない型であるか、メソッドでテストデータを作るとよい場合です。

複数の値を扱う場合
テストの値が複数かつリテラル値以外も扱う場合も有用です。
以下はとても簡単な例ですが、どのように書くかの参考になると思います。

まとめ

  • 1つのテストに複数のデータを適用したいときにはパラメータ化テストを使う。
  • パラメータ化テストを実装するには、junit-jupiter-paramsの依存関係を追加する。
  • パラメータ化テストとして、@ValueSource、@CsvSource、@EnumSource、@MethodSourceが用意されている。

参考

Junit5 Usere Guide – 2.15. Parameterized Tests

最後までお読み頂き、ありがとうございました!
ご意見・ご要望がありましたら、遠慮なくコメント下さい!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

リーマンショックの影響で26歳の時にIT業界から離れ、紆余曲折を経て34歳でエンジニアに復帰しました。
復帰前は開発未経験でしたが、独学した知識と面接時のコミュニケーション力で見事開発エンジニアとして復帰しました!
今はフリーランスエンジニアとして仕事をしています。

■保有資格
・Java Gold SE 11

コメント

コメントする

CAPTCHA


目次