【问题标题】:Haskell, IO, monads, quickcheckHaskell, IO, monads, quickcheck
【发布时间】:2014-03-02 12:32:06
【问题描述】:

这里是 Haskell 的初学者。

我有一个函数和一堆属性来测试它,我使用 quickcheck 编写了这些属性。当我在解释器中单独运行这些属性时,这些属性可以正常工作,并且函数检查正常。

但是,手动快速检查解释器中的每个属性(quickCheck prop_this、quickCheck prop_that)是无聊、单调且耗时的。我想把所有这些都放在一个程序中,并让该程序运行所有的快速检查。这就是我卡住的地方。

程序的基本骨架如下:

imports...

function_which_i_want_to_quickcheck

prop_1
prop_2
etc...

main = do
    quickCheck prop_1
    quickCheck prop_2
    etc...

我相信 main 上面的所有内容都很好,因为没有它,它们都可以编译和工作。主要是我需要帮助的。我尝试了几种变体,即没有做,使用做,使用'x

  1. 任何人都可以提供上述帮助吗?

  2. 如果我想将 main 中的所有内容移动到另一个(正常、非 main)函数,我该怎么做?

编辑:我很欣赏有关测试框架的建议,但我在这里要求的内容对于任何其他语言来说都是微不足道的,并且不需要测试框架。为什么不用 Haskell?

此外,这在解释器中也能正常工作。我无法让它在 main 中工作。任何想法为什么?

quickCheck prop_1 >> quickCheck prop_2 >> quickCheck prop_3

谢谢。

【问题讨论】:

  • 如果你所有的属性都属于同一类型,那么你可以把它们放在一个列表中,然后mapM_
  • 用看不到的代码和看不到的错误来诊断问题并不容易。 Haskellers 有超能力,但也有限制。
  • 您拥有诊断所需的所有信息。阅读问题。我说的是主要工作之上的所有功能和代码。至于main,它是“quickcheck blah”的序列。你是说你需要真正的函数名还是无法诊断?
  • @user3355020 “什么都做不了”——对此唯一明智的答案是“为我工作”(我特此给出)。
  • 我们没有必要的信息。您需要给我们一个失败的完整代码示例,以便我们运行它,查看错误消息并诊断问题。例如,您的某个属性的类型可能存在一些微妙之处,在这里并不明显。

标签: haskell io monads quickcheck


【解决方案1】:

问题不是很清楚你有什么问题,但通常我建议使用测试框架,例如tasty,将你的快速检查测试组织在一起:

import Test.Tasty
import Test.Tasty.QuickCheck

main = defaultMain $ testGroup "Tests"
  [ testProperty "+ is commutative" $
      \x y -> x + y == (y + x :: Double)
  , testProperty "+ is associative" $
      \x y z -> (x + y) + z == (x + (y + z) :: Double)
  ]

要运行它,您需要安装 tasty-quickcheck 包。

执行时的外观如下:

【讨论】:

    【解决方案2】:

    我过去使用过TestFramework。 它允许您创建任意嵌套的测试组,从而为您提供更改输入参数的方法。

    main = do
        defaultMain $ [tier1_tests, ...]
    
    tier1_tests = testGroup "Level One Tests" [tier2_tests1, tier2_tests2, ...]
    
    tier2_tests1 = testGroup "Level Two Testgroup 1" [tier3_tests1, youGetTheIdea, ...]
                     ] 
    tier3_tests1 = testGroup "Level Three Testgroup" [
            testProperty "m=32 random encoding with good x" (prop_realTest1 8 32 True),
            testProperty "m=256 random encoding bad x" (prop_realTest2 128 256 False),
            ... ]
    
    prop_realTest1 m goodq b = forAll arbitrary (\ x -> ...)
    

    【讨论】:

      猜你喜欢
      • 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
      相关资源
      最近更新 更多