2014-03-02 50 views
0

Haskell这里的初学者。Haskell,IO,monads,quickcheck

我有一个函数和一堆属性来测试它与我使用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... 

上面的一切主要是罚款,我相信,因为它所有编译并没有它的工作原理。主要是我需要帮助。我尝试了几个变种,即没有做,使用do,使用'x < - quickCheck y'分配结果,从内部移除quickCheck并将其粘在外部等等,但不能获得任何东西工作。

  1. 任何人都可以协助上述吗?

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

编辑:我很欣赏的测试框架的建议,但我要问这里是微不足道的任何其他语言做的,不应该需要一个测试框架。为什么不是Haskell?

此外,这在解释器内正确工作。我无法在主内部工作。任何想法为什么?

quickCheck prop_1 >> quickCheck prop_2 >> quickCheck prop_3 

谢谢。

+0

如果您的所有属性都属于同一类型,那么您可以将它们放在列表中并执行'mapM_'。 – Sibi

+4

诊断代码的问题并不是很容易,因为无法看到有人看不到的错误。哈斯克勒拥有超级大国,但有限制。 –

+0

你有你需要诊断的所有信息。阅读这个问题。我说过主要工作的所有功能和代码。至于main,它是一系列“quickcheck blah”。你是说你需要真正的功能名称,或者你无法诊断? – user3355020

回答

3

它是不是从你有什么问题,问题很清楚,但一般我会建议使用一个测试框架,如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软件包。

下面是执行时的样子:

screenshot

1

我已经在过去使用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 -> ...)