2011-09-27 9 views
8

Me gustaría que todas mis propiedades siempre se prueben con al menos un conjunto fijo de valores especiales además de algunos valores aleatorios. Me gustaría definir esto en la especificación de mi generador, no en todas las pruebas que usan ese tipo de generador. Por ejemplo, si estuviera generando Ints, me gustaría que mi generador siempre genere al menos 0, 1 y -1 para cada caso de prueba. es posible?¿Cómo conseguir que el arbitrario de ScalaCheck genere siempre algunos valores de casos especiales?

El mejor que he encontrado hasta el momento es hacer un generador de tamaño, donde los más pequeños n tamaños corresponden a mis n casos especiales. Esto es problemático al menos porque no se prueban todos los tamaños posibles cuando el número máximo de pruebas está configurado para ser inferior al parámetro de tamaño máximo.

Respuesta

17

En primer lugar, hay ya está un sesgo en Scalacheck de manera que 0, 1, -1, Int.MaxValue y Int.MinValue son muy propensos a ser elegido, además de otros Int valores. Entonces, si esa es su preocupación, no se preocupe. Del mismo modo, es probable que se generen cadenas vacías.

Pero, si desea reproducir este comportamiento para otra cosa, use Gen.oneOf o Gen.frequency, quizás junto con Gen.choose. Como oneOf y frequency toman Gen como parámetro, puede combinar casos especiales con generadores genéricos.

Por ejemplo:

val myArb: Arbitrary[Int] = Arbitrary(Gen.frequency(
    1 -> -1, 
    1 -> 0, 
    1 -> 1, 
    3 -> Arbitrary.arbInt.arbitrary 
)) 

lo hace bastante más de lo que solicitó, con un 50% de probabilidad de enteros arbitrarios (que vendrá con el sesgo que hablé), y el 16,6% para cada uno de -1, 0 y 1.

+0

Ok, supongo que me conformaré con muy probablemente. Gracias por una respuesta completa! En realidad estoy generando expresiones booleanas por cierto. – mpartel

Cuestiones relacionadas