【问题标题】:How to iteratively test in Haskell using QuickCheck?如何使用 QuickCheck 在 Haskell 中进行迭代测试?
【发布时间】:2020-01-16 08:10:49
【问题描述】:

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

让我举个例子来说明。在下面的代码 sn-p 中,我生成了一个 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)

我找到了这个post (How can QuickCheck test all properties for each sample),但它并没有真正帮助我。

【问题讨论】:

    标签: haskell testing quickcheck


    【解决方案1】:

    考虑withMaxSuccess 函数:

    withMaxSuccess :: Testable prop => Int -> prop -> Property
    

    这是一个接受任何Testable 并将其转换为Property 的函数。生成的Property 的行为是它将运行Int 指定的最大数量。

    test1 函数是一个Testable 实例。当您调用withMaxSuccess 3 test1 时,您会更改test1 的行为,以便当它运行时它最多运行3 次。

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

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

    【讨论】:

    • 迄今为止的最佳答案 ;) 有没有办法实现我正在寻找的东西,即在给定次数的 test2 中重用为 test1 生成的 Int?
    • @JohnSmith 这样做有帮助吗? stackoverflow.com/a/45541161/126014我现在有点赶时间,但如果需要,我很乐意在今天晚些时候提供帮助。
    • 我正在尝试通过链接中的代码 sn-p 工作。明天我会在这里更新我的进展。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多