JUnit5でパラメータテストをする-その2-(@NullSource,@EmptySource,@NullAndEmptySource,@CsvFileSource)

エキサイト株式会社エンジニア佐々木です。前回 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

@NullSourceNULL値をテストするときに便利です。

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