Ir al contenido principal
Versión: 5.9.x

Nombres de pruebas parametrizadas

[Traducción Beta No Oficial]

Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →

Por defecto, el nombre de cada prueba es simplemente el resultado de toString() en la fila de entrada. Esto suele funcionar bien con data classes en JVM, pero requiere que las filas de entrada sean estables.

Sin embargo, podemos especificar cómo se generan los nombres de prueba si no usamos data classes estables, si ejecutamos en plataformas no-JVM, o simplemente queremos personalizarlos.

Nombres estables

Al generar pruebas, Kotest necesita un nombre de prueba estable durante la ejecución del conjunto de pruebas. El nombre se usa como base para un identificador que apunta a una prueba al notificar a Gradle o IntelliJ sobre su estado. Si el nombre no es estable, el ID puede cambiar, provocando errores donde las pruebas no aparecen o parecen no haberse completado.

Kotest solo usará el toString() de la clase de entrada si considera que tiene un valor toString() estable; de lo contrario, usará el nombre de la clase.

Puedes forzar a Kotest a usar toString() para los nombres de prueba anotando tu tipo con @IsStableType. Entonces se usará toString() en todos los casos.

Alternativamente, puedes personalizar completamente el nombre visible de la prueba.

Usando un mapa

Kotest permite especificar nombres de prueba pasando un mapa a la función withData, donde la clave es el nombre de prueba y el valor es el dato de entrada para esa fila.

context("Pythag triples tests") {
withData(
mapOf(
"3, 4, 5" to PythagTriple(3, 4, 5),
"6, 8, 10" to PythagTriple(6, 8, 10),
"8, 15, 17" to PythagTriple(8, 15, 17),
"7, 24, 25" to PythagTriple(7, 24, 25)
)
) { (a, b, c) ->
a * a + b * b shouldBe c * c
}
}

Función para nombres de prueba

También podemos pasar a withData una función que tome la fila como entrada y devuelva el nombre de prueba. Dependiendo de lo generosa que esté la inferencia de tipos de Kotlin, quizá necesites especificar el parámetro de tipo en la función withData.

context("Pythag triples tests") {
withData<PythagTriple>(
nameFn = { "${it.a}__${it.b}__${it.c}" },
PythagTriple(3, 4, 5),
PythagTriple(6, 8, 10),
PythagTriple(8, 15, 17),
PythagTriple(7, 24, 25)
) { (a, b, c) ->
a * a + b * b shouldBe c * c
}
}

La salida de este ejemplo resulta ahora más clara:

Ejemplo de salida para pruebas parametrizadas

WithDataTestName

Otra alternativa es implementar la interfaz WithDataTestName. Cuando se proporciona, no se usará toString(), sino que se invocará la función dataTestName() de esta interfaz para cada fila.

data class PythagTriple(val a: Int, val b: Int, val c: Int) : WithDataTestName {
override fun dataTestName() = "wibble $a, $b, $c wobble"
}