Ir al contenido principal
Versión: 5.4.x

Generadores

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

Los valores generados son proporcionados por instancias de la clase sellada Gen. Puedes pensar en un Gen como un tipo de flujo de entrada pero para valores de pruebas de propiedades. Cada Gen proporcionará un flujo (generalmente infinito) de estos valores para un tipo particular.

Kotest tiene dos tipos de generadores: Arb para generar valores arbitrarios (aleatorios) y Exhaustive para generar un conjunto finito de valores en un espacio cerrado.

Ambos tipos de gens pueden combinarse en pruebas de propiedades. Por ejemplo, podrías probar una función con 100 enteros positivos aleatorios (un arb) junto con cada número par de 0 a 200 (exhaustive).

Algunos generadores solo están disponibles en JVM. Consulta la lista completa aquí.

Arbitrarios (Arb)

Los Arb generan dos tipos de valores: un conjunto codificado de casos límite (edge cases) y un flujo infinito de muestras elegidas aleatoriamente.

Las muestras pueden repetirse, y algunos valores podrían no generarse nunca. Por ejemplo, generar 1000 enteros entre 0 e Int.MAX no puede devolver todos los valores posibles, y algunos pueden generarse más de una vez. Del mismo modo, generar 1000 enteros aleatorios entre 0 y 500 definitivamente hará que algunos valores aparezcan múltiples veces.

Algunos arbitrarios comunes incluyen números con o sin rango, cadenas del conjunto unicode, listas aleatorias, data classes con parámetros aleatorios, emails, code points, caracteres, etc.

Además de los valores aleatorios, los arbs pueden proporcionar casos límite. Una característica de diseño en las pruebas de propiedades de Kotest es que los valores para ciertos tipos siempre incluirán casos límite "comunes" que probablemente quieras incluir en tus pruebas.

Por ejemplo, al probar una función que acepta un entero, probablemente quieras asegurarte de que, como mínimo, se pruebe con cero, un número positivo y uno negativo. Si solo se proporcionaran valores aleatorios, las probabilidades de que aparezca cero serían bastante bajas, por lo que Kotest siempre incluirá algunos "casos límite" para enteros (a menos que especifiques lo contrario).

Durante la ejecución de pruebas, el framework alternará aleatoriamente entre muestras y casos límite. La proporción viene determinada por un valor de configuración que por defecto es del 2% para casos límite.

No todos los arbs tienen casos límite, pero los arbs para los tipos más comunes sí. Aquí hay ejemplos de casos límite utilizados por algunos arbs:

  • enteros: 0, 1, -1, Int.MAX_VALUE, Int.MIN_VALUE

  • doubles: 0, 1, -1, Double.MAX_VALUE, Double.MIN_VALUE, Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.NaN

  • cadenas: cadena vacía, cadena de longitud mínima, code point más bajo

  • listas: lista vacía, lista con un solo elemento, lista con elementos duplicados

  • mapas: mapa vacío

  • valores anulables: null

Exhaustivos (Exhaustive)

Los Exhaustive generan todos los valores de un espacio determinado. Esto es útil cuando quieres asegurarte de que se usa cada valor en ese espacio. Por ejemplo, para valores enum, suele ser más útil garantizar que cada enum se utilice, en lugar de seleccionar aleatoriamente entre los valores enum y potencialmente omitir algunos o duplicar otros.

Los exhaustivos típicos incluyen colecciones pequeñas, enums, valores booleanos, powerset de una lista o conjunto, rangos enteros predefinidos y rangos de cadenas predefinidos.

Una vez que un exhaustive ha proporcionado todos sus valores, se reiniciará, por lo que puede usarse en una prueba que requiera cualquier número de entradas.

Por ejemplo:

enum class Season { Winter, Fall, Spring, Summer }

forAll<Int, Season>(100) { a, season -> ... }

Aquí solicitamos 100 iteraciones, por lo que cada valor de Season se proporcionaría 25 veces.