简单的haskell单元测试
我想通过99个Haskell问题,我想专注于解决方案,但需要测试。 如果我将第一个问题的解决方案作为3行.hs
文件解决,
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
不处理[]
情况(它应该,但应该可能会抛出像'最后'的错误)。 但是,我们可以简单地调整我们的测试,但指定只应使用非空字符串(使用==>
combinator):
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集成在一起。
链接地址: http://www.djcxy.com/p/14179.html上一篇: Simple haskell unit testing
下一篇: How to increment a java String through all the possibilities?