Estoy intentando ejecutar QuickCheck en algunas listas anidadas, algo que se parece a esto:¿Cómo obtengo buenas (pequeñas) contracciones de QuickCheck?
type Constraint = Text
data Value = Value [Constraint]
data Literal = Literal Value [Value]
type Formula = [Literal]
Así que una fórmula es una lista de literales, cada una de las cuales contiene un predicado y algunos argumentos; predicado/argumentos son valores que son una disyunción de restricciones en forma de cadena cada uno. Eso nos da una lista de listas de listas, ¡uf!
Si una de mis propiedades de QuickCheck falla, tiendo a obtener una cantidad incomprensible de resultados. Antes de experimentar con Shrink, solía sortear esto teniendo instancias arbitrarias que solo podían generar un pequeño conjunto de valores (pequeños). Implementar la función de reducción para cada uno de mis tipos parece ayudar un poco, pero no tanto como me gustaría. Todavía tengo una página llena de resultados.
Creo que lo que quiero de shrink es una pequeña lista de literales, donde cada literal tiene una pequeña lista de valores, que a su vez tiene pocas restricciones, cada una de las cuales es lo más corta posible. Pero en mis esfuerzos actuales, al menos estas listas son lo suficientemente grandes como para que la producción sea horrible. Si trato de ajustar mis implementaciones de reducción, también descubro que el control de calidad comienza a tomar mucho tiempo (¿en busca de psiquiatras?), Lo que amortigua mis esfuerzos por reducir el tamaño efectivamente.
¿Cómo mejora sus posibilidades de comprender las fallas de QuickCheck cuando ha anidado datos como este?
Algunas cosas que he intentado: prefiriendo shrinkList shrinkNowhing encogerList shrink, y esta [alternativa shrinkList] (https://gist.github.com/1582767) que intenta favorecer la eliminación de más elementos. Sospecho que me estoy volcando demasiado y debería estar haciendo algo totalmente diferente, como cambiar mis implementaciones arbitrarias, o probar de una manera diferente :-) – kowey
Por ahora, voy a la ruta pre-encogida ('tomar 5 <$> arbitrario'), que todavía parezco encontrar errores con – kowey
No es exactamente una respuesta, pero ¿ha intentado utilizar SmallCheck o incluso LazySmallCheck en lugar de QuickCheck? –