简单的haskell单元测试

| 我想经历99个Haskell问题,我想专注于解决方案,但要进行测试。如果我有第3行as0 line文件作为第一个问题的解决方案,
myLast :: [a] -> a
myLast [x] = x
myLast (_:xs) = myLast xs
我可以为此添加的最少代码量是多少,以便可以内联添加测试并以
runhaskell
运行它们?     
已邀请:
QuickCheck(基本上为您生成测试输入)可能是测试纯功能的最佳方法。而且,如果所讨论的函数具有标准库中的类似物,则可以使用标准函数作为模型来测试您的函数:
{-# 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指定“ 5”行为的另一种方法可能是:
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集成。     

要回复问题请先登录注册