Ir al contenido principal
Versión: 5.8.x

Funciones de prueba de propiedades

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

En Kotest existen dos variantes de funciones para ejecutar pruebas de propiedades: forAll y checkAll.

For All

La primera, forAll, acepta una función n-aria (a, ..., n) -> Boolean que evalúa la propiedad. La prueba será exitosa si, para todos los valores de entrada, la función devuelve true.

class PropertyExample: StringSpec({
"String size" {
forAll<String, String> { a, b ->
(a + b).length == a.length + b.length
}
}
})

Observa que esta función acepta parámetros de tipo para los argumentos, con aridad de hasta 14. Kotest utiliza estos parámetros de tipo para localizar un generador que proporciona (genera) valores aleatorios del tipo adecuado.

Por ejemplo, forAll<String, Int, Boolean> { a, b, c -> } es una prueba de propiedad de aridad 3 donde el argumento a es un String aleatorio, b un entero aleatorio y c un booleano aleatorio.

Check All

La segunda, checkAll, acepta una función n-aria (a, ..., n) -> Unit donde puedes ejecutar aserciones contra las entradas. Este enfoque considerará válida la prueba si no se lanzan excepciones. Aquí tienes el mismo ejemplo escrito de forma equivalente usando checkAll.

class PropertyExample: StringSpec({
"String size" {
checkAll<String, String> { a, b ->
a + b shouldHaveLength a.length + b.length
}
}
})

El segundo enfoque tiene un propósito más general que devolver un booleano, pero el primero proviene de las bibliotecas originales de Haskell que inspiraron esta librería.

Iteraciones

Por defecto, Kotest ejecuta las pruebas de propiedades 1000 veces. Podemos personalizar esto fácilmente especificando el número de iteraciones al invocar el método de prueba.

Supongamos que queremos ejecutar una prueba 10.000 veces.

class PropertyExample: StringSpec({
"a many iterations test" {
checkAll<Double, Double>(10_000) { a, b ->
// test here
}
}
})

Especificación de generadores

En los ejemplos anteriores viste que Kotest proporcionaba valores automáticamente basándose en los parámetros de tipo. Lo hace localizando un generador que produce valores para el tipo requerido.

Por ejemplo, el generador de Integer proporcionado automáticamente genera enteros aleatorios de todos los valores posibles: negativos, positivos, infinitos, cero, etc.

Esto es aceptable para pruebas básicas, pero a menudo queremos más control sobre el espacio muestral. Por ejemplo, podríamos querer probar una función solo para números en cierto rango.

En ese caso necesitarías especificar los generadores manualmente.

class PropertyExample: StringSpec({
"is allowed to drink in Chicago" {
forAll(Arb.int(21..150)) { a ->
isDrinkingAge(a) // assuming some function that calculates if we're old enough to drink
}
}
"is allowed to drink in London" {
forAll(Arb.int(18..150)) { a ->
isDrinkingAge(a) // assuming some function that calculates if we're old enough to drink
}
}
})

Puedes observar que creamos dos pruebas y en cada una pasamos un generador a la función forAll con un rango de enteros adecuado.

Consulta aquí la lista de generadores incorporados.