positions :: Eq a => a -> [a] -> [Int]
positions x xs = [i | (x',i) <- zip xs [0..], x == x']
我需要为positions函数创建一个Test函数,该函数会通过快速检查。
有人有主意吗?
答案 0 :(得分:1)
可能的测试可以执行以下操作:
xs, ys :: [Int]
和y :: Int
list = xs ++ y : ys
length xs `elem` positions y list
您可能还想编写缺少元素的测试。
话虽这么说,但根据代码进行测试很奇怪。人们应该使用用于编写代码的规范来设计测试。否则,如果代码有一些怪癖,那么它们也将最终通过测试:我们没有检查代码应该做什么,而是检查了代码做什么,这可能毫无意义。
答案 1 :(得分:0)
好问题!当我开始使用QuickCheck
时,我对此也有些麻烦,但是当我使用更多时,我开始对应该测试哪种类型的属性有一种感觉。通常,一个好的开始是考虑输入和输出之间应该保持什么样的关系。您的函数在列表中查找元素的索引;现在在这种情况下应该拥有哪些属性?这是我想到的两个:
这是如何测试这些属性的概述:
positions
,然后计算返回的索引数,并检查其是否与搜索到的值的出现次数相符。positions
并检查每个返回索引处的元素是否为所搜索的值。我还认为@chi's answer的好处是您应该根据规范而不是代码来设计测试;这与我在上面所说的有关,因为规范可以帮助您找到输入和输出之间的关系,而这些关系可能无法从代码中立即看出来。