31 votes

Comment puis-je obtenir de bons (petits) retraits dans QuickCheck?

Je suis en train de lancer QuickCheck sur certaines listes imbriquées, quelque chose qui ressemble à ceci:

type Constraint = Text
data Value = Value [Constraint]
data Literal = Literal Value [Value]
type Formula = [Literal]

Si une formule est une liste de littéraux, dont chacune contient un prédicat et certains arguments; prédicat/argument sont des valeurs qui sont une disjonction de contraintes dans la forme d'une chaîne de chacun. Cela nous donne une liste de listes de listes de listes, ouf!

Si l'un de mes QuickCheck propriétés échoue, j'ai tendance à avoir une incompréhensible pageful de sortie. Avant d'expérimenter avec frette, j'ai utilisé à contourner ce problème en ayant arbitraire instances qui pourrait générer seulement une petite série de (petite) des valeurs. La mise en œuvre de la réduction de la fonction pour chacun de mes types semble aider un peu, mais pas autant que je le voudrais. Je reçois toujours un pageful de sortie.

Je pense que je veux de la rétrécir, est une petite liste de littéraux, où chaque littéral a une petite liste de valeurs, qui à son tour a peu de contraintes, dont chacun est aussi court que possible. Mais dans l'exercice de mes efforts, au moins une de ces listes devient assez grand pour faire la sortie d'horrible. Si j'essaie de régler mon rétrécir implémentations, je trouve aussi que le QC commence à prendre un temps très long (de la recherche pour rétrécit?), le type qui amortit mes efforts pour réduire de manière efficace.

Comment pouvez-vous améliorer vos chances de compréhension QuickCheck échecs lorsque vous avez des données imbriquées comme ça?

3voto

nh2 Points 4421

FWIW, consultez https://github.com/leepike/SmartCheck , qui prétend générer de meilleures réductions que celles que l’on peut généralement faire manuellement.

1voto

stralep Points 182

J'ai eu un problème similaire, mais j'ai été en utilisant C et à la maison fait générateur d'exemple :) j'ai eu lente et correct et rapide et la mise en œuvre incorrecte.

À l'aide de random exemples, lorsque vous trouvez un exemple incorrect, je dirais rétrécissement de l'exemple lui-même. (Ce qui, bien sûr, pourrait ou devrait être fait par programme, au lieu de par ordinateur)

Si vous avez des prédicats de ce test, et vous avez des exemple qui ne fonctionne pas, essayez d'éliminer les éléments de formulaire de listes de toutes les commandes (ce qui devrait être linéaire de l'ordre de grandeur des appels) et pour chaque essai, si elle échoue le test.

S'il échoue encore, il n'y a aucune raison de garder ce dans l'exemple.

Si elle commence à passer, alors cet élément devrait rester dans la réduction de exemple.

(C'est gourmand et pas optimal, mais il ne s'exécutent dans le poly, au lieu de temps exponentiel, et il a travaillé pour moi)

Pour plus de regard scientifique, je suggère le chapitre "Simplifier les problèmes" du livre "POURQUOI les PROGRAMMES de l'ÉCHEC: UN Guide de Débogage Systématique" par A. Zeller.

Remarque: c'est surtout ce rétrécissement n'...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X