Ir al contenido principal
Versión: 5.6.x

data_driven_testing_4.2.0

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

Para probar tu código con diferentes combinaciones de parámetros, puedes usar una tabla de valores como entrada para tus casos de prueba. Esto se conoce como data driven testing (pruebas basadas en datos) o también table driven testing (pruebas basadas en tablas).

Invoca la función forAll o forNone, pasando uno o más objetos row donde cada fila contiene los valores para una única ejecución de la prueba. Después de forAll o forNone, configura tu función de prueba real para que acepte los valores de cada fila como parámetros.

El objeto row acepta cualquier conjunto de tipos, y el comprobador de tipos garantizará que tus tipos sean consistentes con los tipos de parámetros en la función de prueba.

"square roots" {
forAll(
row(2, 4),
row(3, 9),
row(4, 16),
row(5, 25)
) { root, square ->
root * root shouldBe square
}
}

En el ejemplo anterior, los parámetros root y square se infieren automáticamente como enteros.

Si ocurre un error en cualquier fila de entrada específica, la prueba fallará y KotlinTest emparejará automáticamente cada entrada con los nombres de parámetros correspondientes. Por ejemplo, si modificamos el ejemplo anterior para incluir la fila row(5,55), la prueba se marcará como fallida con este mensaje de error.

Test failed for (root, 5), (square, 55) with error expected: 55 but was: 25

Las pruebas basadas en tablas pueden usarse con cualquier tipo de especificación. Aquí tienes un ejemplo usando StringSpec.

class StringSpecExample : StringSpec({
"string concat" {
forAll(
row("a", "b", "c", "abc"),
row("hel", "lo wo", "rld", "hello world"),
row("", "z", "", "z")
) { a, b, c, d ->
a + b + c shouldBe d
}
}
})

Puede ser deseable tratar cada fila de parámetros como una prueba individual. Para generar estas pruebas individuales, sigue un patrón similar en cada estilo de especificación. Aquí tienes un ejemplo en FreeSpec.

class IntegerMathSpec : FreeSpec({
"Addition" - {
listOf(
row("1 + 0", 1) { 1 + 0 },
row("1 + 1", 2) { 1 + 1 }
).map { (description: String, expected: Int, math: () -> Int) ->
description {
math() shouldBe expected
}
}
}
// ...
"Complex Math" - {
listOf(
row("8/2(2+2)", 16) { 8 / 2 * (2 + 2) },
row("5/5 + 1*1 + 3-2", 3) { 5 / 5 + 1 * 1 + 3 - 2 }
).map { (description: String, expected: Int, math: () -> Int) ->
description {
math() shouldBe expected
}
}
}
})

Genera 4 pruebas y 2 descripciones padre:

IntegerMathSpec
✓ Addition
✓ 1 + 0
✓ 1 + 1
✓ Complex Math
✓ 8/2(2+2)
✓ 5/5 + 1*1 + 3-2