簡體   English   中英

簡單的haskell單元測試

[英]Simple haskell unit testing

我想通過99個Haskell問題 ,我想專注於解決方案,但需要測試。 如果我將第一個問題的解決方案作為3行.hs文件,

myLast :: [a] -> a
myLast [x] = x
myLast (_:xs) = myLast xs

我可以添加的最小代碼量是多少,以便我可以在線添加測試並使用runhaskell運行它們?

快速檢查 (你這basicaly生成測試輸入)可能是測試純函數的最佳方式。 如果有問題的函數具有標准庫中的模擬,您可以使用標准函數作為模型來測試函數:

{-# LANGUAGE TemplateHaskell #-}

import Test.QuickCheck
import Test.QuickCheck.All

myLast :: [a] -> a
myLast [x] = x
myLast (_:xs) = myLast xs

-- here we specify that 'myLast' should return exactly the same result
-- as 'last' for any given 'xs'
prop_myLast xs = myLast xs == last xs


return [] -- need this for GHC 7.8
-- quickCheckAll generates test cases for all 'prop_*' properties
main = $(quickCheckAll)

如果你運行它,你會得到:

=== prop_myLast on tmp3.hs:12 ===
*** Failed! Exception: 'tmp3.hs:(7,1)-(8,25): Non-exhaustive patterns in function myLast' (after 1 test):  
[]
False

因為你的myLast沒有處理[]情況(它應該但應該拋出像'last'這樣的錯誤)。 但是在這里我們可以簡單地調整我們的測試,但是指定只應該使用非空字符串(使用==>組合器):

prop_myLast xs = length xs > 0 ==> myLast xs == last xs

這使得所有100個自動生成的測試用例都可以通過myLast

=== prop_myLast on tmp3.hs:11 ===
+++ OK, passed 100 tests.
True

PS另一種指定myLast行為的方法可能是:

prop_myLast2 x xs = myLast (xs++[x]) == x

或更好:

prop_myLast3 x xs = x `notElem` xs ==> myLast (xs++[x]) == x

hspec也是Haskell的測試框架,受Ruby RSpec的啟發。 它集成了QuickCheck,SmallCheck和HUnit。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM