2012-12-03 82 views
0

好吧,我有多個測試用例設置,然後將它們組合在一起。 我忘了把一些代碼了,所以我說這當我在Haskell中運行測試時,我的輸出即將出現

的問題是,當我把例如主要>測試1顯示出正確的答案,但如果我嘗試單獨運行測試用例如主> TEST0我的輸出變成 「測試用例_」

主> ALLTESTS我出放是「TestList [TestLabel TEST1測試用例_,TestLabel TEST0測試用例_,TestLabel TEST7測試用例_,TestLabel est51測試用例_ ]「

我的問題是什麼原因引起的_爲什麼是不是認識測試用例

assertException :: (Exception e, Eq e) => e -> IO a -> IO() 
assertException ex action = 
     handleJust isWanted (const $ return()) $ do 
      action 
      assertFailure $ "Expected exception: " ++ show ex 
    where isWanted = guard . (== ex) 

assertError ex f = 
     assertException (ErrorCall ex) $ evaluate f 



tests :: Integer -> [Integer] 

tests n | n == 0    = error "Not positive" 
     | n == 1    = [1] 
     | (n `div` 2 == 0) = n:tests(n*2) 
     | otherwise   = n:tests(3*n) 



test0 = 
     TestCase (assertError 
        "tests 0" 
        (tests 0) 
       ) 


test7 = 
     TestCase (assertEqual 
        "tests 7" 
       [7,18,9] 
        (tests 7) 
       ) 

test51 = 
     TestCase (assertEqual 
        [9,8,9] 
        "tests 51" 

        (tests 51) 
       ) 



alltests = 
    TestList [ 
      -- TestLabel "test1" test1 
       TestLabel "test0" test0 
      , TestLabel "test7" test7 
      , TestLabel "test51"test51 
      ] 
+3

「當我在這裏複製時忽略了一些間距,它沒有出來」 - 這是一個不好的跡象。你在源代碼中使用了標籤嗎?如果是這樣,不要。使用製表符,看起來正確縮進的代碼可以完全被刪除。 –

+0

測試用例間距在我的程序中是正確的,測試用例是作爲模板給出的,我必須在其中編寫代碼。我的代碼與測試用例沒有配合,就好像它不能識別測試用例中的ex:(測試51)部分 – Watts

+1

這只是一般性建議。如果您的縮進實際上已被選項卡打破,您將收到錯誤消息。 –

回答

1

起初,我不得不說,你的代碼是一個爛攤子。你確實寫過,複製破壞了你的格式,但是,如果你真的想要一個解決好你的問題的方法,那麼寫出一個寫得很好的問題也不錯。儘管如此,實際運行代碼還是需要進行一些更改。

例如: 在你的test0定義,您使用一種稱爲assertError不存在的功能,所以我想,你的意思是assertEqual就像你其他的測試用例。測試用例的另一個問題是函數assertEqual :: (Eq a, Show a) => String -> a -> a -> Assertion用法:它需要三個參數,但在您的定義中只有兩個參數。後兩個參數代表預期值和實際值,我猜你忘了實際值。所以我不知道,你想測試什麼。

編輯:但我想,以你的功能和相應的測試的問題是,你的函數構造了一個無限的列表(除01作爲n輸入值),那麼你的函數不會終止,以及在測試用例。 (我首先想到這也是神祕輸出的原因,但這似乎是錯誤的。)

5

當您鍵入test0allTests(注意:不能以上限大小寫字母,因爲它不是構造函數)。 test0也是類型TestallTests的值。因此,當您在ghci提示符處輸入這些值時,該值將通過show轉換爲String,然後String被打印出來。

Show實例Test不能包含Assertion秒值進行轉換爲有意義的String因爲AssertionIO -action。因此它通常在那裏顯示一個下劃線來表示「這是一個斷言」。

tests 1 
另一方面

tests 1 :: Integral a => [a]類型的表達式,當你在提示符下鍵入這樣的表達,即通過show太轉換爲String(通過默認爲Integer固定型可變a之後) ,但這裏的Show實例需要完整評估列表。

要實際運行測試,您需要runTestTTperformTest(或來自HUnit的其他測試運行者之一)。

相關問題