Testing 如何为Haskell';s快速检查功能

Testing 如何为Haskell';s快速检查功能,testing,haskell,random,quickcheck,Testing,Haskell,Random,Quickcheck,每次我运行“quickCheck prop_xyz”时,都会使用一个新的随机种子。如何强制QuickCheck始终使用相同的随机种子 谢谢 您需要的功能在中;用于指定自定义。特别是,有一个字段,它允许您重播测试。因此,您可以使用默认值并调整它们;比如说, ghci> :load Main.hs ghci> import Test.QuickCheck ghci> import System.Random -- for mkStdGen ghci> quickCheckWi

每次我运行“quickCheck prop_xyz”时,都会使用一个新的随机种子。如何强制QuickCheck始终使用相同的随机种子


谢谢

您需要的功能在中;用于指定自定义。特别是,有一个字段,它允许您重播测试。因此,您可以使用默认值并调整它们;比如说,

ghci> :load Main.hs
ghci> import Test.QuickCheck
ghci> import System.Random -- for mkStdGen
ghci> quickCheckWith stdArgs{replay = Just (mkStdGen 42, 0)} prop_xyz

元组的第二个组成部分与测试用例的大小有关,但我完全忘记了什么。

使用
quickCheckWith
函数

quickCheckWith (stdArgs{replay = Just (myNewGen, testSize)}) property
如果您有一个失败的测试,并且希望重用它

result <- quickCheckResult failing_prop
let gen = usedSeed result
let size = usedSize result

result如果要确定导致故障的
生成器
,可以执行以下操作:

import Test.QuickCheck
import System.Random


reproducableTest :: Testable a => a -> Maybe (StdGen, Int) -> IO ()
reproducableTest prop repl = do result <- quickCheckWithResult stdArgs{replay = repl} prop
                                case result of
                                     Failure{interrupted = False} -> do putStrLn $ "Use " ++ show (usedSeed result) ++ " as the initial seed"
                                                                        putStrLn $ "Use " ++ show (usedSize result) ++ " as the initial size"
                                     _       -> return ()

然后,您将使用
可复制测试道具$Just(mkStdGen x,z)
再次调用QuickCheck>=2.7和tf random的示例

如果失败测试运行的输出如下所示:

故障{
usedSeed=TFGenR 1CE4E8B15F9197B60EE70803C2388671B62D6F88720288F5339F7EC521FEBC4 0 70368744177663 46 0,
USEDSIZE=75,
...        
}
然后,您可以按如下方式再现故障:

import Test.QuickCheck.Random(QCGen(..)
导入System.Random.TF(TFGen)
qcheck::可测试a=>a->IO()
qcheck prop=quickCheckWith args prop
哪里
usedSeed=QCGen(读“TFGenR 1CE4E8B15F9197B60EE70803C2388671B62D6F88720288F5339F7EC521FEBC4 0 70368744177663 46 0”:
usedSize=75
args=stdArgs{
replay=Just(usedSeed,usedSize)
}

请问您为什么要这样做?如果您想要可重复的测试,那么一个好的shrink实现就更有用了。这里的全部要点是随机的,所以恒定的种子会失败that@jozefg:我知道在过去,当您想评估发电机等的性能时,我们发现它很有用。@jozefg:我们正在使用QuickCheck进行一些实验,并希望重现我们的结果。谢谢您的提问。最好使用
读取“x y”::StdGen
,因为
显示(mkStdGen 42)=“43 1”
。(
read
show
保证在这里正常工作。)在最新版本中是
Test.QuickCheck.Random.mkQCGen
。正如@SebastianGraf所暗示的,您需要的是Test.QuickCheck.Random.QCGen,而不是System.Random.StdGen。它没有在hackage上列出,但是Test.QuickCheck.Random公开了mkQCGen,其用途与mkStdGen相同。
  Use x y as the initial seed
  Use z as the initial size