Testing 如何为Haskell';s快速检查功能
每次我运行“quickCheck prop_xyz”时,都会使用一个新的随机种子。如何强制QuickCheck始终使用相同的随机种子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
谢谢 您需要的功能在中;用于指定自定义。特别是,有一个字段,它允许您重播测试。因此,您可以使用默认值并调整它们;比如说,
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