Haskell - 基于属性的异常测试

时间:2014-03-03 21:47:10

标签: unit-testing haskell testing quickcheck smallcheck

我正在为我的本地函数编程小组编写Haskell的介绍。 作为基础,我使用的是Tasty-testing框架,我想测试索引函数(!!)

MinimalExample.hs

module MinimalExample where

myIndex :: Int -> [a] -> a                                               
myIndex _ [] = error "index too large"                                   
myIndex 0 (x:_) = x                                                      
myIndex n (_:xs) = myIndex (n-1) xs                                      

MinimalTests.hs

module MinimalTests where

import Test.Tasty
import Test.Tasty.SmallCheck as SC
import Test.SmallCheck.Series

import MinimalExample

main :: IO ()
main = defaultMain tests

tests :: TestTree
tests = testGroup "Tests" [scProps]

scProps ::  TestTree
scProps = testGroup "(checked by SmallCheck)"
  [ SC.testProperty "(!!) == myIndex" $ \lst n ->
      lst !! n == myIndex (n::Int) (lst::[Int])
  ]

由于错误/异常相同,测试应该在“太大的索引”上失败。

测试应该以负输入失败 - 可以通过在输入中添加NonNegative作为约束来解决,或者在myIndex - 函数中添加相应的子句来解决。

1 个答案:

答案 0 :(得分:1)

您可以使用spoon包,或编写一个类似的函数,如果您想测试异常是相同的,则会返回异常。