2014-03-02 151 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 -> ...)