Introducción
Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →
Antes de Kotest 6.0, las pruebas basadas en datos eran un módulo separado. A partir de Kotest 6.0, esta funcionalidad está
incluida en el framework principal, por lo que no existe un módulo kotest-framework-datatest que añadir. Por favor, elimínalo de tu configuración de compilación.
Esta sección cubre el nuevo y mejorado soporte para pruebas basadas en datos lanzado con Kotest 4.6.0. Para ver la documentación del soporte anterior de pruebas de datos, haz clic aquí
Si estás utilizando pruebas basadas en datos en plataformas kotlin-native y solo tienes pruebas basadas en datos (es decir, cero pruebas manuales), consulta la sección sobre Soporte para Native.
Al escribir pruebas basadas en lógica, tiene sentido probar uno o dos caminos de código específicos para escenarios particulares. Pero otras veces tenemos pruebas más basadas en ejemplos, donde sería útil probar muchas combinaciones de parámetros.
En estas situaciones, las pruebas basadas en datos (también llamadas pruebas basadas en tablas) son una técnica sencilla para evitar código repetitivo tedioso.
Kotest tiene soporte de primera clase para pruebas basadas en datos integrado en el framework. Esto significa que Kotest generará automáticamente casos de prueba basados en valores de entrada que tú proporciones.
Primeros pasos
Consideremos escribir pruebas para una función de triple pitagórico que devuelve true si los valores de entrada son triples válidos (a al cuadrado + b al cuadrado = c al cuadrado).
fun isPythagTriple(a: Int, b: Int, c: Int): Boolean = a * a + b * b == c * c
Como necesitamos más de un elemento por fila (necesitamos 3), comenzamos definiendo una clase de datos que contendrá una única fila de valores (en nuestro caso, las dos entradas y el resultado esperado).
data class PythagTriple(val a: Int, val b: Int, val c: Int)
Crearemos pruebas usando instancias de esta clase de datos, pasándolas a la función withData, que también
acepta un lambda que ejecuta la lógica de prueba para esa fila dada.
Por ejemplo:
class MyTests : FunSpec({
context("Pythag triples tests") {
withData(
PythagTriple(3, 4, 5),
PythagTriple(6, 8, 10),
PythagTriple(8, 15, 17),
PythagTriple(7, 24, 25)
) { (a, b, c) ->
isPythagTriple(a, b, c) shouldBe true
}
}
})
Observa que al usar clases de datos, la fila de entrada puede desestructurarse en sus propiedades miembro. Al ejecutarse, tendremos 4 casos de prueba en nuestra entrada, uno por cada fila de datos.
Kotest generará automáticamente un caso de prueba por cada fila de entrada, como si hubieras escrito manualmente un caso de prueba separado para cada una.

Los nombres de las pruebas se generan a partir de las propias clases de datos, pero pueden personalizarse.
Si ocurre un error en cualquier fila de entrada, la prueba fallará y Kotest mostrará los valores que
fallaron. Por ejemplo, si modificamos el ejemplo anterior para incluir la fila PythagTriple(5, 4, 3),
esa prueba se marcará como fallida.

El mensaje de error contendrá el fallo y los detalles de la fila de entrada:
Test failed for (a, 5), (b, 4), (c, 3) expected:<9> but was:<41>
En el ejemplo anterior, envolvimos la llamada a withData en una prueba principal para tener más contexto al ver los resultados.
La sintaxis varía según el estilo de spec usado; aquí usamos fun spec que emplea bloques context para contenedores.
De hecho, las pruebas basadas en datos pueden anidarse dentro de cualquier número de contenedores.
Pero esto es opcional; también puedes definir pruebas basadas en datos en el nivel raíz.
Por ejemplo:
class MyTests : FunSpec({
withData(
PythagTriple(3, 4, 5),
PythagTriple(6, 8, 10),
PythagTriple(8, 15, 17),
PythagTriple(7, 24, 25)
) { (a, b, c) ->
isPythagTriple(a, b, c) shouldBe true
}
})
Las pruebas basadas en datos solo pueden definirse en el nivel raíz o en ámbitos de contenedor. No pueden definirse dentro de ámbitos hoja.
Soporte para Native
Si estás utilizando pruebas basadas en datos en plataformas kotlin-native y solo tienes pruebas basadas en datos (es decir, cero pruebas manuales), debes configurar el plugin de Gradle de Kotlin para que no falle la build debido a que no se detectan pruebas. Esto ocurre porque Kotest genera las pruebas basadas en datos en tiempo de ejecución, y el mecanismo de detección de pruebas de kotlin-native no ve ninguna prueba en tiempo de compilación. Nuevamente, esto solo aplica si usas exclusivamente pruebas basadas en datos.
tasks.withType<KotlinTest>().configureEach {
failOnNoDiscoveredTests = false
}
Callbacks
Si deseas usar callbacks before/after en pruebas basadas en datos, puedes usar el soporte estándar de beforeTest/afterTest.
Cada prueba creada con esta técnica se comporta igual que una prueba regular, por lo que todos los callbacks estándar funcionan como si hubieras escrito todas las pruebas manualmente.
Por ejemplo:
beforeTest {
// reset test setup
}
context("...") {
withData(X, Y, Z) { x,y,z ->
// test code
}
}