如何编写不模仿函数实现的QuickCheck测试?

sda*_*das 10 testing haskell unit-testing quickcheck

我正在使用Haskell和QuickCheck为以下函数编写测试:

{-| Given a list of points and a direction, find the point furthest
along in that direction. -}

fn :: (Eq a, Ord a, DotProd a) => [a] -> a -> a
fn pnts dir = pnts !! index
    where index = fromJust $ elemIndex (maximum dotproducts) dotproducts
          dotproducts = map (dot dir) pnts
Run Code Online (Sandbox Code Playgroud)

我相信这个实现是正确的,因为它不是太复杂的功能.但是,我想使用QuickCheck来测试一些边缘情况.

但是,我遇到的问题是,当我定义我的QuickCheck测试时,它们与我正在测试的功能相同.

如何在QuickCheck中编写一个测试功能目的而不重复实现的测试?

Tox*_*ris 14

如何在QuickCheck中编写一个测试功能目的而不重复实现的测试?

首先,请注意,有时,一个表示函数根据其当前实现行为的quickcheck属性并非完全没有价值.如果您更改了实现,则可以将其用于回归测试.例如,如果您优化fn使用聪明数据结构的定义,则基于旧的,更直接的实现的Quickcheck属性可能会有所帮助.

其次,您经常希望Quickcheck属性检查函数的高级和声明性属性,而实现通常是较低级别且可直接执行.在这种情况下,您可以指定以下属性:

  • forall列表的点ps和方向d,该点fn ps d在列表ps中.

  • 以ps为单位的点列表ps,方向d和forall点p,点p在d方向上不比点更远fn ps d.

  • forall point p和forall direction d,fn [p, origin] d是p.

我不完全确定基础几何,所以我的例子可能是愚蠢的.但是我希望这些例子能够传达一般的想法:快速检查属性可以检查规范的属性"在一个方向上更进一步",而不提及特定的算法.