测试位置功能

时间:2018-11-24 02:30:33

标签: haskell testing quickcheck

positions :: Eq a => a -> [a] -> [Int]
positions x xs = [i | (x',i) <- zip xs [0..], x == x']

我需要为positions函数创建一个Test函数,该函数会通过快速检查。

有人有主意吗?

2 个答案:

答案 0 :(得分:1)

可能的测试可以执行以下操作:

  • 随机生成xs, ys :: [Int]y :: Int
  • 定义list = xs ++ y : ys
  • 测试length xs `elem` positions y list

您可能还想编写缺少元素的测试。

话虽这么说,但根据代码进行测试很奇怪。人们应该使用用于编写代码的规范来设计测试。否则,如果代码有一些怪癖,那么它们也将最终通过测试:我们没有检查代码应该做什么,而是检查了代码做什么,这可能毫无意义。

答案 1 :(得分:0)

好问题!当我开始使用QuickCheck时,我对此也有些麻烦,但是当我使用更多时,我开始对应该测试哪种类型的属性有一种感觉。通常,一个好的开始是考虑输入和输出之间应该保持什么样的关系。您的函数在列表中查找元素的索引;现在在这种情况下应该拥有哪些属性?这是我想到的两个:

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

这是如何测试这些属性的概述:

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

我还认为@chi's answer的好处是您应该根据规范而不是代码来设计测试;这与我在上面所说的有关,因为规范可以帮助您找到输入和输出之间的关系,而这些关系可能无法从代码中立即看出来。