Ich schrieb einen Algorithmus, um eine Lösung für das Subset-Summenproblem in Haskell zu finden. Die Signatur lautetSteuern, wie Testdaten in QuickCheck generiert werden
subsetSum :: (Ord a, Num a) => [a] -> a -> Maybe [a]
QuickCheck scheint eine gute Passform zu sein, um das zu testen. Zum Beispiel ist ich hier eine der Eigenschaften, die ich überprüfen konnte:
prop_sumEqualsS l s = case subsetSum l s of
Just solution -> (sum solution) == s
Nothing -> True
Das Problem ist, dass der Algorithmus sehr rechenintensiv ist und 100 Tests mit großen Eingangslisten laufen dauert ewig zu laufen.
Ich versuchte mit QuickCheck 1 und es lief schnell, aber die zum Testen verwendeten Datensätze waren sehr klein. Nach dem Wechsel zu QuickCheck 2 scheint es das umgekehrte Problem zu sein. Es gibt a manual für QC, aber es scheint alt zu sein (es gibt keine Datumsinformationen) und ich weiß nicht, wie viel noch für QC2 gilt. A Tutorial ist auf der Haskell Wiki verfügbar, aber es gibt nicht viele Details, nur ein paar Worte über die Instanziierung Arbitrary
.
So habe ich zwei Fragen:
- Was 2 in Quick ändert es so viel langsamer als Quick Check werden lassen?
- Wie können Sie die Erstellung von Datensätzen am besten steuern, damit sie für einen bestimmten Test nützlich sind?
Edit: Um genauer zu sein, ich möchte meine Lösung mit einer Liste der Größe von 0 bis 100, testen, ganze Zahlen zwischen -10000 und 10000.
Ihre Fragen scheint ein wenig für den Kontext von Quick Check vage; vielleicht solltest du lieber eine allgemeine Testfrage stellen. Es gibt jedoch ein paar Probleme mit Ihrem aktuellen Ansatz: Es wird nicht überprüft, ob die Lösung tatsächlich eine Teilmenge ist, oder dass, wenn die Funktion Nothing zurückgibt, tatsächlich keine Lösung vorhanden ist. – gatoatigrado
@gatoatigrado Das Anwesen war nur ein Beispiel. Ich glaube, dass das Überprüfen, dass die Lösung eine Teilmenge ist, in eine andere Eigenschaft gehört. Liege ich falsch? Ich sehe keinen einfachen Weg, um zu überprüfen, dass wenn Nothing zurückgegeben wird, es tatsächlich keine Lösung gibt, außer das Problem mit einem anderen Algorithmus wieder zu lösen. Dies scheint ein wenig überflüssig. – Antoine
http://stackoverflow.com/questions/10712373/cookbook-for-converting-from-quickcheck1-to-quickcheck2 – gliptak