Ir al contenido principal
Versión: 5.9.x

Introducción

[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 →

[Módulo Requerido]

Antes de usar pruebas basadas en datos, debes añadir el módulo kotest-framework-datatest a tu build.

nota

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í

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.

salida de ejemplo de prueba basada en datos

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.

salida de ejemplo de prueba 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
}
})
precaución

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.

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
}
}

Nombres personalizados para casos

Si deseas o necesitas que los subtest de datos tengan nombres personalizados, la forma más sencilla de lograrlo es pasando un Map a withData. La clave se utilizará como el nombre del subtest, y el valor se utilizará como el it real para la prueba.

Por ejemplo:

  withData(
mapOf( // all-whitespace strings make lousy test names
"empty" to "",
"blank" to " ",
)
) {
it.isBlank() shouldBe true
}