エキサイト株式会社エンジニア佐々木です。前回 JUnit5でパラメータテストをする(@ValueSource, @CsvSource, @MethodSource) - エキサイト TechBlog. でパラメータテストの一部を書かせていただきました。残りの機能をご紹介します。
前提
環境は下記になります。
# Java openjdk version "19.0.1" 2022-10-18 OpenJDK Runtime Environment Corretto-19.0.1.10.1 (build 19.0.1+10-FR) OpenJDK 64-Bit Server VM Corretto-19.0.1.10.1 (build 19.0.1+10-FR, mixed mode, sharing) # JUnit org.junit.jupiter:junit-jupiter-api:5.8.1
build.gradle
plugins { id 'java' } group 'org.example' version '1.0-SNAPSHOT' repositories { mavenCentral() } dependencies { testImplementation(platform('org.junit:junit-bom:5.9.1')) testImplementation('org.junit.jupiter:junit-jupiter') } test { useJUnitPlatform() }
@NullSource
@NullSource
はNULL
値をテストするときに便利です。
public class MainTest { @ParameterizedTest @NullSource void NullSourceTest(String s){ System.out.println("Null Source " + s + " test"); Assertions.assertThat(s).isNull(); Assertions.assertThat(s).isNotNull(); } } 実行結果 == Null Source null test // Nullチェックのアサーションのテストの方で落ちています. Expecting actual not to be null ==
実行してみると、String s
の部分に NULL
値が入っています。NULL
値なので、Assertions.assertThat(s).isNotNull();
のチェックでエラーとなっています。
@EmptySource
@EmptySource
は空文字
をテストするときに便利です。String,プリミティブの配列,Collection系(Map,List,Set)で使用できます。
public class MainTest { @ParameterizedTest @EmptySource void EmptySourceIntTest(int[] m){ System.out.println("Empty Source " + m.length + " test"); Assertions.assertThat(m).isEmpty(); Assertions.assertThat(m).isNotEmpty(); } @ParameterizedTest @EmptySource void EmptySourceStringTest(String m){ System.out.println("Empty Source " + m + " test"); Assertions.assertThat(m).isBlank(); Assertions.assertThat(m).isNotBlank(); } } 実行する == Empty Source 0 test // 配列が空じゃないアサーションでエラーがでています Expecting actual not to be empty Empty Source test // Stringが空じゃないアサーションでエラーがでています Expecting not blank but was: "" ==
サンプルコードでは、Stringとint配列で実行しています。テストに空配列,空文字列がある場合のエラーチェックでエラーになっています。
@NullAndEmptySource
@NullAndEmptySource
は、@NullSource
と@EmtpySource
の組み合わせになります。NULL
の場合とEMPTY
の場合と2回実行されます。
@ParameterizedTest @NullAndEmptySource void NullAndEmptySourceStringTest(String m){ System.out.println("Empty Source " + m + " test"); Assertions.assertThat(m == null || m.isEmpty()).isTrue(); } 実行結果: === Empty Source null test Empty Source test ===
実行してみると、上記のようにNULL
の場合とEMPTY
の場合と2回実行されます。
テストはNULL
の場合とEMPTY
の場合も通るようなコードなので、エラーはでていません。
CsvFileSource
前回紹介させていただいた、CsvSourceでもっと大量のパターンがある場合は、@CsvFileSource
でファイルから読み込む方法があります。
public class MainTest { @ParameterizedTest @CsvFileSource(files = "./id_name.csv", useHeadersInDisplayName = true) void CsvFileSourceTest(int id, String name){ System.out.println("id: " + id + " name: " + name + " test"); Assertions.assertThat(id).isNotZero(); Assertions.assertThat(name).isNotBlank(); } } id_name.csv == id,name 1,john 2,sam 3, == 実行結果 == id: 1 name: john test id: 2 name: sam test id: 3 name: null test // NotBlankが期待値なのですが、nullが入ってきているのでテストでエラーになっています Expecting not blank but was: null ==
useHeadersInDisplayName = true
を設定すると、先頭行がスキップされます。実行すると、ファイルをから1行ずつ実行されます。大量のテストケースがある場合はとても便利です。
まとめ
前回に引き続き、パラメータテストする際の便利なアノテーションを紹介させていただきました。少しでも楽にテストがかけるようになって、開発生産性を上げられればと思います。
最後に
エキサイトではフロントエンジニア、バックエンドエンジニア、アプリエンジニアを随時募集しております。長期インターンも歓迎していますので、興味があれば連絡いただければと思います。
カジュアル面談はこちらになります! meety.net
募集職種一覧はこちらになります!(カジュアルからもOK) www.wantedly.com