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 basadas en 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 utilizar rutas de código específicas que cubran escenarios particulares. Otras veces tenemos pruebas más orientadas a ejemplos, donde sería útil probar múltiples combinaciones de parámetros.
En estos casos, las pruebas basadas en datos (también llamadas pruebas basadas en tablas) son una técnica sencilla para evitar código repetitivo tedioso.
Kotest incluye soporte nativo para pruebas basadas en datos integrado en el framework. Esto significa que Kotest generará automáticamente casos de prueba basados en los valores de entrada que proporciones.
Primeros pasos
Consideremos escribir pruebas para una función de conversión de Celsius a Fahrenheit. La entrada será el valor en Celsius y la salida esperada será el valor en Fahrenheit.
fun cToF(celsius: Int): Int = (celsius * 9 / 5) + 32
Dependiendo del estilo de Spec utilizado, Kotest proporciona métodos withXXX que reflejan el DSL de cada estilo.
Por ejemplo, si usamos el estilo fun spec, podemos emplear la función withTests.
Al crear pruebas basadas en datos, debemos encapsular cada conjunto de entradas (llamado fila) en una clase. Como en este
ejemplo necesitamos dos argumentos por fila, podemos usar un objeto Pair de Kotlin. Con más de dos argumentos,
usaríamos una clase de datos personalizada.
Creamos una prueba basada en datos usando la función withXXX, pasando las filas y un lambda que ejecuta la lógica
de prueba para cada fila.
Por ejemplo:
class MyTests : FunSpec({
withTests(
Pair(0, 32),
Pair(100, 212),
Pair(-40, -4),
Pair(-30, -30),
)
{ (celsius, fahrenheit) ->
cToF(celsius) shouldBe fahrenheit
}
})
Observa que al usar Pair o clases de datos, la fila de entrada puede desestructurarse en sus propiedades miembro.
Kotest generará automáticamente un caso de prueba por cada fila de entrada, como si hubieras escrito cada prueba manualmente. Así, en este ejemplo al ejecutar la prueba basada en datos, obtendremos cuatro resultados de prueba independientes.

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>
Anidamiento
En el ejemplo anterior ubicamos las pruebas en el nivel raíz. También puedes anidar pruebas basadas en datos dentro de otros
contenedores o incluso dentro de otras pruebas basadas en datos. Por ejemplo, podemos envolver el caso anterior en un bloque context para enriquecer
la información en los resultados. De hecho, estas pruebas pueden anidarse en cualquier número de contenedores.
Por ejemplo:
class MyTests : FunSpec({
context("celsius to fahrenheit") {
withTests(
Pair(0, 32),
Pair(100, 212),
Pair(-40, -4),
Pair(-30, -30),
)
{ (celsius, fahrenheit) ->
cToF(celsius) shouldBe fahrenheit
}
}
})
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 usas pruebas basadas en datos en plataformas kotlin-native y solo tienes este tipo de pruebas (es decir, cero pruebas manuales), debes configurar el plugin de Gradle de Kotlin para que no falle la compilación por no encontrar pruebas. Esto ocurre porque Kotest genera las pruebas basadas en datos en tiempo de ejecución, y el mecanismo de descubrimiento de pruebas de kotlin-native no detecta pruebas en tiempo de compilación. Nuevamente, esto solo aplica si usas exclusivamente pruebas basadas en datos.
tasks.withType<KotlinTest>().configureEach {
failOnNoDiscoveredTests = false
}
Hooks del ciclo de vida
Si deseas que los hooks before/after se apliquen por cada fila en una prueba basada en datos, puedes usar los hooks estándar
de Kotest como beforeTest y afterTest. Cada prueba generada mediante pruebas basadas en datos
se comporta igual que una prueba regular equivalente, por lo que todas las callbacks funcionan como si hubieras escrito las pruebas manualmente.
Consulta la documentación de hooks del ciclo de vida
Por ejemplo:
beforeTest {
// reset test setup
}
context("...") {
withTests(X, Y, Z) { x,y,z ->
// test code
}
}
Variantes WithXXX
Cada estilo de Spec tiene su propio conjunto de withXXX que definen un contenedor o un contexto hoja.
Las combinaciones por estilo de Spec se enumeran a continuación:
| Test Style | Available withXXX Functions | Legacy withData Maps To |
|---|---|---|
| FunSpec | withContexts (creates container contexts)withTests (creates leaf tests) | withContexts |
| StringSpec | withData (creates leaf tests) | withData (native) |
| DescribeSpec | withContexts (creates container contexts)withDescribes (creates container describes)withIts (creates leaf tests) | withContexts |
| ShouldSpec | withContexts (creates container contexts)withShoulds (creates leaf tests) | withContexts |
| WordSpec | withWhens (creates when containers)withShoulds (creates should containers) | withWhens |
| BehaviorSpec | withContexts (creates container contexts)withGivens (creates given containers)withWhens (creates when containers)withThens (creates then leaf tests)withAnds (creates and containers in given scope) | withContexts |
| FreeSpec | withContexts (creates container contexts)withTests (creates leaf tests) | withContexts |
| ExpectSpec | withContexts (creates container contexts)withExpects (creates leaf expect tests) | withContexts |
| FeatureSpec | withFeatures (creates feature containers)withScenarios (creates leaf scenario tests) | withFeatures |
Versiones de Kotest anteriores a 6.1 incluían una única función withData. Esta función aún existe y apunta a una
variante apropiada para cada estilo de Spec. Sin embargo, se prefieren las nuevas variantes withXXX ya que permiten controlar si
se define un contenedor o una prueba hoja.
Puedes encontrar ejemplos completos de cómo utilizar cada uno de estos en estas pruebas de Kotest