我正在为我当地的函数式编程小组写一篇关于 Haskell 的介绍。作为基础,我正在使用 Tasty-testing 框架,并且我想测试 indexing function (!!)
。
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
-function 中添加相应的子句来解决。
- 我可以在基于属性的测试中测试异常吗?
- 或者我是否必须使用 (H) 单元测试,如如何在 Haskell 中测试错误?或Haskell 异常和单元测试,在这种情况下,我如何选择从 0 到生成的测试列表长度范围内的索引。