0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

JUnit5の試験実装3パターン比較

Posted at

久しぶりに新規のJavaプロジェクトを立ち上げる。
テストコードについて今から立ち上げるプロジェクトでSpockを選択というのはコミュニティがEclipse捨てた背景から開発環境に制限をかけるようでちょっとな〜という気持ち。
JUnit5ベースにどうか書けばいいか、パラメータテストをどう実装できるのか確認していく。

試験対象

処理はなんだっていいので値を2つ受け取って文字列をくっつけるだけの雑なものを用意する。

package com.batch.demo.base.util;

public class TextUtils {

    /**
     * 渡された2つの文字列を結合する
     * @param firstText 1つ目の文字列
     * @param secondText2つ目の文字列
     * @return 結合した文字列
     */
    public String mixTwoText(String firstText, String secondText) {
        return firstText + secondText;
    }
}

試験パターンの統一

以下の試験パターンを共通して実装して、コード量や結果の見え方を確認していく。

  • aaaXXX を渡すと aaaXXX が返却されること
  • bbbXXX を渡すと bbbXXX が返却されること
  • cccXXX を渡すと cccXXX が返却されること

通常のJUnit5

package com.batch.demo.base.util;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

public class TextUtilsTest {

    @Test
    void TextMixTestCase1(){
        String first = "aaa";
        String second = "XXX";
        TextUtils textUtils = new TextUtils();
        String result = textUtils.mixTwoText(first, second);
        Assertions.assertEquals("aaaXXX", result);
    }
    @Test
    void TextMixTestCase2(){
        String first = "bbb";
        String second = "XXX";
        TextUtils textUtils = new TextUtils();
        String result = textUtils.mixTwoText(first, second);
        Assertions.assertEquals("bbbXXX", result);
    }
    @Test
    void TextMixTestCase3(){
        String first = "ccc";
        String second = "XXX";
        TextUtils textUtils = new TextUtils();
        String result = textUtils.mixTwoText(first, second);
        Assertions.assertEquals("cccXXX", result);
    }
}

うーん、なんか古臭い・・・

TestParameterInjector

TestParameterInjectorというGoogleがJavaのテストで利用しているというテストライブラリを試してみる。

package com.batch.demo.base.util;

import com.google.testing.junit.testparameterinjector.junit5.TestParameter;
import com.google.testing.junit.testparameterinjector.junit5.TestParameterInjectorTest;
import org.junit.jupiter.api.Assertions;

public class TextUtilsTest {
    protected enum TextMixTestCase {
        Case1("aaa","XXX","aaaXXX"),
        Case2("bbb","XXX","bbbXXX"),
        Case3("ccc","XXX","cccXXX");

        private String first;
        private String second;
        private String answer;
        private TextMixTestCase(String first, String second, String answer) {
            this.first = first;
            this.second = second;
            this.answer = answer;
        }
    }
    @TestParameterInjectorTest
    void test1(@TestParameter TextMixTestCase textMixTestCase) {
        TextUtils textUtils = new TextUtils();
        Assertions.assertEquals(textUtils.mixTwoText(textMixTestCase.first,textMixTestCase.second), textMixTestCase.answer);
    }
}

うーん、いいらしいという雰囲気に惑わされただけかな。
enumが面倒だ。。

JUnit5のParameterizedTest

package com.batch.demo.base.util;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;

public class TextUtilsTest {
    @ParameterizedTest
    @CsvSource({
            "aaa,  XXX,  aaaXXX",
            "bbb,  XXX,  bbbXXX",
            "ccc,  XXX,  cccXXX",
    })
    void paramTestJunit(String first, String second, String answer) {
        TextUtils textUtils = new TextUtils();
        Assertions.assertEquals(textUtils.mixTwoText(first, second), answer);
    }
}

一番スッキリしてる!!

締め

JUnit5のParameterizedTestでパラメータをCsvSourceで指定して試験を実施できるのが一番スッキリしてる!
このパラメータをテストクラスファイル内じゃなく外部CSVファイルとかJSONファイルとして外に持つこともできるんだろうか。。。。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?