Parameterizedテストのテストケース名をわかりやすく表示する

はじめに

JUnitのParameterizedテストでテストケース名は以下の図のように、パラメータごとに test[0] , test[1], ... という表示がされます
f:id:scache:20201228203120p:plain:w300

この表示では、いくつかのパラメータでテストが失敗した場合に、どのパラメータの時にテストが失敗しているかがわかりづらいという問題があります
今回はこの問題を解決するためにテストケース名を変更する方法を説明します
※ コードはKotlinを使っていますがJavaでも同様の方法でできます

Parametersの引数を使ってテストケース名を変更する

Parameterizedテストのパラメータを指定する時に @Parameterized.Parameters アノテーションを使用しますが、このアノテーションは引数を受け取ることが可能です
この引数を変更することでテストケース名の表示を変えることができます

例えば、 @Parameterized.Parameters(name = "xxx") と指定すると

test[xxx]
test[xxx]
...
test[xxx]

という表示がされます

固定の文字列を表示しても何のメリットもないので、各パラメータの情報を表示する方法も提供されていて、 テストクラスで受け取るパラメータのindexを指定して表示することができます

例えば以下のように3つの引数がある場合に name = "{0} + {1} = {2}" を指定すると、

@RunWith(Parameterized::class)
class ParameterizedDoubleTest(
    private val v1: Double,
    private val v2: Double,
    private val expected: Double,
) {
        ...
        @Parameterized.Parameters(name = "{0} + {1} = {2}")
        fun params(): List<Array<Any>> {
            return listOf(
                arrayOf(1.5, 2.5, 4.0),
                arrayOf(2.5, 1.5, 4.0),
                arrayOf(1.5, 3.5, 4.0),
                arrayOf(2.5, 2.5, 5.0),
            )
        }
        ...
}

以下のように ${v1} + ${v2} = ${expected} のフォーマットで表示されます

test[1.5 + 2.5 = 4]
test[1.5 + 3.5 = 4]
test[2.5 + 1.5 = 4]
test[2.5 + 2.5 = 5]

それぞれのパラメータは toString() で返ってくる文字列に変換されるため、パラメータを1つのクラスにまとめて表現している場合は toString() をオーバーライドすると良いでしょう

@RunWith(Parameterized::class)
class ParameterizedDescriptionTest(p: Param) {
    data class Param(
        val v1: Double,
        val v2: Double,
        val expected: Double,
    ){
        override fun toString(): String {
            return "$v1 + $v2 = $expected"
        }
    }
        
    companion object{
        ....
        @Parameterized.Parameters(name = "{0}")
        fun params(): List<Param> {
            return listOf(
                Param(1.5, 2.5, 4.0),
                ...
            )
        }
        ...
    }
}

おまけ

Parameters アノテーションの引数は MessageFormat (Java Platform SE 8) のフォーマットが使えます
例えば、以下の指定をするとDoubleの値の少数第2位まで表示することができます

@Parameterized.Parameters(name = "{0, number, #.00} + {1, number, #.00} = {2, number, #.00}")