Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用QuickCheck在Haskell中进行迭代测试?_Haskell_Testing_Quickcheck - Fatal编程技术网

如何使用QuickCheck在Haskell中进行迭代测试?

如何使用QuickCheck在Haskell中进行迭代测试?,haskell,testing,quickcheck,Haskell,Testing,Quickcheck,如何在Haskell QuickCheck中生成一个随机实例,然后在此实例上运行进一步的测试 让我举个例子来说明。在下面的代码片段中,我生成了一个Int,然后想对这个Int进行进一步的测试: {-# OPTIONS -Wall #-} import Test.Tasty import Test.Tasty.QuickCheck as QC import qualified Debug.Trace as Trace main :: IO() main =

如何在Haskell QuickCheck中生成一个随机实例,然后在此实例上运行进一步的测试

让我举个例子来说明。在下面的代码片段中,我生成了一个
Int
,然后想对这个
Int
进行进一步的测试:

{-# OPTIONS -Wall #-}

import           Test.Tasty
import           Test.Tasty.QuickCheck as QC
import qualified Debug.Trace as Trace

main :: IO()
main = defaultMain tests

test1 :: Int -> Property
test1 i = withMaxSuccess 2 (test2 i)

test2 :: Int -> (Int, Int) -> Property
test2 i (a, b) =
  Trace.trace ("(n,a,b) = " ++ show (i, a, b)) $
  property True

tests :: TestTree
tests =
  testGroup
  "Test suite"
  [
    QC.testProperty "Test" (withMaxSuccess 3 test1)
  ]
作为输出,我希望有如下内容:

(n,a,b) = (0,0,0)
(n,a,b) = (0,1,2)
(n,a,b) = (-1,-1,-1)
(n,a,b) = (-1,-2,-3)
(n,a,b) = (2,0,-2)
(n,a,b) = (2,1,-1)
但我得到的却是:

(n,a,b) = (0,0,0)
(n,a,b) = (-1,-1,-1)
(n,a,b) = (2,0,-2)

我发现了这个,但它并没有真正帮助我。

考虑一下
with maxsuccess
函数:

withMaxSuccess :: Testable prop => Int -> prop -> Property
这是一个函数,它接受任何
可测试的
,并将其转换为
属性
。生成的
属性
的行为是,它将以
Int
指定的最大数目运行

test1
函数是一个可测试的
实例。当您使用MaxSuccess 3 test1调用
时,您会更改
test1
的行为,使其在运行时最多运行三次

虽然
test1
返回一个
属性,其行为仅运行两次(
withMaxSuccess 2
),但它会被
withMaxSuccess 3
覆盖


withMaxSuccess
函数不运行测试,它只是更改属性的定义
withMaxSuccess 3
是对属性的最新修改,因此您会看到它运行三次。

请考虑
withMaxSuccess
函数:

withMaxSuccess :: Testable prop => Int -> prop -> Property
这是一个函数,它接受任何
可测试的
,并将其转换为
属性
。生成的
属性
的行为是,它将以
Int
指定的最大数目运行

test1
函数是一个可测试的
实例。当您使用MaxSuccess 3 test1调用
时,您会更改
test1
的行为,使其在运行时最多运行三次

虽然
test1
返回一个
属性,其行为仅运行两次(
withMaxSuccess 2
),但它会被
withMaxSuccess 3
覆盖


withMaxSuccess
函数不运行测试,它只是更改属性的定义
withMaxSuccess 3
是对该属性的最新修改,因此您会看到它运行了三次。

迄今为止的最佳答案;)有没有一种方法可以实现我想要的,那就是重复使用test2中为test1生成的Int给定次数?@JohnSmith做了类似的帮助?我现在时间有点紧,但如果需要的话,我很乐意在今天晚些时候提供帮助。我正在努力完成链接中的代码片段。明天我会在这里更新我的进度。谢谢。这是迄今为止最好的答案;)有没有一种方法可以实现我想要的,那就是重复使用test2中为test1生成的Int给定次数?@JohnSmith做了类似的帮助?我现在时间有点紧,但如果需要的话,我很乐意在今天晚些时候提供帮助。我正在努力完成链接中的代码片段。明天我会在这里更新我的进度。谢谢