位置测试-功能


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时,我也遇到了一些问题,但随着我使用得越来越多,我开始感觉到应该测试什么样的属性。通常,一个好的开始是思考输入和输出之间应该保持什么样的关系。函数在列表中查找元素的索引;现在,在这种情况下应该持有哪些财产?这里有两个我能想到的:

  1. 索引列表中的元素数量应与列表中出现的值相同
  2. 每个索引都应该对应正确的值

以下是如何测试这些特性的概述:

  1. 生成一个随机列表,对其应用positions,然后计算返回的索引数,并检查它是否与搜索值的出现次数匹配
  2. 生成一个随机列表,然后对其应用positions,并检查每个返回索引处的元素是否为搜索到的值

我还认为@chi的回答很好地说明了你应该从规范而不是代码来设计测试;这与我上面所说的有关,因为规范可以帮助您找到输入和输出之间的关系,而这些关系可能在代码中并不明显。

最新更新