2011-11-19 12 views
14

Bir değer bir QuickCheck'd sınaması başarısız olduğunda, hata ayıklama için kullanmak istiyorum. Gibi bir şey yapmak herhangi bir yolu var mı:Hızlı denetim için başarısız olan değeri bulma

let failValue = quickCheck' myTest 
in someStuff failValue 

benim veriler daha sonra muhtemelen IO onu almak için bir yol kesmek olabilir mümkün read, ama değilse.

cevap

9

QuickCheck API'sinde bunu güzel bir şekilde yapmak için hiçbir şey bulamadım, ancak burada monadic QuickCheck API'yi kullanarak birlikte çalıştığım bir şey var. Bu, IORef içinde mülkünüze ait girdileri yakalar ve günlüğe kaydeder ve başarısız olursa, sonuncunun suçlu olduğunu ve bir Just içinde döndürdüğünü varsayar. Test geçtiyse, sonuç Nothing'dur. Bu muhtemelen biraz düzeltilebilir, ancak basit argüman özellikleri için işi yapmalıdır.

+0

çok akıllı, teşekkürler – Xodarap

+0

Bu küçük hile sadece Haskell hata ayıklama deneyimimi çok daha iyi yaptı. Teşekkürler –

2

sample' yöntemini kullanmanın tek yolu, el ile sınamayı çalıştırmak ve başarısız olduğu değerleri bulmaktır. Örneğin, arızalı bir çift fonksiyon test: tek sorun sample' olan

import Test.QuickCheck 

double :: Int -> Int 
double x | x < 10 = 2 * x 
     | otherwise = 13 

doubleTest :: Int -> Bool 
doubleTest x = x + x == double x 

tester :: IO() 
tester = do 
    values <- sample' arbitrary 
    let failedValues = filter (not . doubleTest) values 
    print failedValues 

sadece hata tetiklemek için yeterli olmayabilir 11 test değerlerini oluşturur.

İlgili konular