Ir al contenido principal
Versión: 5.4.x

Suposiciones

[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 restringir el conjunto de valores generados por un generador, podemos usar un filtro para devolver un arb restringido.

val evens = Arb.int().filter { it.value % 2 == 0 }

Sin embargo, si necesitamos restringir las entradas basándonos en la relación entre valores, filtrar un solo arb no funcionará. Consideremos un ejemplo donde queremos probar que dos cadenas no iguales tienen una distancia de Levenshtein distinta de cero.

checkAll<String, String> { a, b ->
levenshtein(a, b) shouldBeGreaterThan 0
}

Esto fallará periódicamente - cada vez que se generen dos cadenas iguales. Un enfoque sería envolver las pruebas en un bloque if/else para evitar esas entradas no deseadas.

checkAll<String, String> { a, b ->
if (a != b)
levenshtein(a, b) shouldBeGreaterThan 0
}

Pero en escenarios más complejos podríamos introducir fácilmente un error y filtrar todas nuestras entradas.

Kotest proporciona una función llamada suposiciones que filtra combinaciones no deseadas mientras verifica que no estamos filtrando demasiadas.

Una suposición acepta un valor booleano pasado a la función withAssumptions, que si es verdadero permite continuar la prueba de propiedades, pero si es falso, omite esa iteración particular. Por ejemplo, el caso anterior ahora pasará:

checkAll<String, String> { a, b ->
withAssumptions(a != b) {
levenshtein(a, b) shouldBeGreaterThan 0
}
}

Alternativamente, puedes usar la sintaxis en línea:

checkAll<String, String> { a, b ->
assume(a != b)
levenshtein(a, b) shouldBeGreaterThan 0
}

Afirmaciones

Kotest amplía las suposiciones booleanas básicas permitiéndote especificar afirmaciones en una función de suposición.

Por ejemplo, basándonos en el caso anterior:

checkAll(Arb.string(3..4, Codepoint.az()), Arb.string(3..4, Codepoint.az())) { a, b ->
withAssumptions({
a shouldNotBe b
a shouldHaveLength (b.length)
}) {
a.compareTo(b) shouldNotBe 0
}
}

Aquí nos aseguramos de que todas las entradas sean diferentes y tengan la misma longitud. Cualquier afirmación que lance AssertionError puede usarse aquí, incluyendo todas las afirmaciones proporcionadas por Kotest.

Esto también admite sintaxis en línea:

checkAll<String, String> { a, b ->
assume {
a shouldNotBe b
a shouldHaveLength (b.length)
}
levenshtein(a, b) shouldBeGreaterThan 0
}

Porcentaje Máximo de Descartados

Por defecto, el porcentaje máximo de descartados es 10%. Si se descartan más combinaciones que eso, la prueba de propiedades fallará. Esto ayuda a evitar escenarios donde descartamos erróneamente demasiadas o incluso todas nuestras entradas.

Por ejemplo, lo siguiente fallaría por defecto porque estaríamos filtrando aproximadamente el 50% de los valores.

checkAll<Int, Int> { a, b ->
withAssumptions(a % 2 == 0) {
..
}
}

Pero si queremos permitir esto de todos modos, podemos usar maxDiscardPercentage para aumentar la tasa de descartados permitida.

checkAll<Int, Int>(PropTestConfig(maxDiscardPercentage = 55)) { a, b ->
withAssumptions(a % 2 == 0) {
..
}
}

Generalmente es mejor ajustar tus arbs para producir valores más cercanos a lo que necesitas, de modo que solo debas filtrar casos extremos no deseados.