positions :: Eq a => a -> [a] -> [Int]
positions x xs = [i | (x',i) <- zip xs [0..], x == x']
我需要为positions函数创建一个Test函数,它通过了快速检查。
有人有主意吗?
一个可能的测试可以执行以下操作:
- 随机生成
xs, ys :: [Int]
和y :: Int
- 定义
list = xs ++ y : ys
- 测试
length xs `elem` positions y list
您可能还想为丢失的元素编写测试。
话虽如此,从代码中进行测试是很奇怪的。应该使用用于编写代码的规范来设计测试。否则,如果代码有一些怪癖,它们也会在测试中结束:我们不检查代码应该做什么,而是检查代码做什么,这可能毫无意义。
好问题!当我开始使用QuickCheck
时,我也遇到了一些问题,但随着我使用得越来越多,我开始感觉到应该测试什么样的属性。通常,一个好的开始是思考输入和输出之间应该保持什么样的关系。函数在列表中查找元素的索引;现在,在这种情况下应该持有哪些财产?这里有两个我能想到的:
- 索引列表中的元素数量应与列表中出现的值相同
- 每个索引都应该对应正确的值
以下是如何测试这些特性的概述:
- 生成一个随机列表,对其应用
positions
,然后计算返回的索引数,并检查它是否与搜索值的出现次数匹配 - 生成一个随机列表,然后对其应用
positions
,并检查每个返回索引处的元素是否为搜索到的值
我还认为@chi的回答很好地说明了你应该从规范而不是代码来设计测试;这与我上面所说的有关,因为规范可以帮助您找到输入和输出之间的关系,而这些关系可能在代码中并不明显。