F#

时间:2016-01-30 15:46:54

标签: unit-testing f#

我在F#中编写了以下函数,给定两点,返回一个函数,表示通过这两点的行:

let getFunction (point1:float*float) (point2:float*float) =
    let x1 = fst point1
    let y1 = snd point1
    let x2 = fst point2
    let y2 = snd point2
    let m = (y2-y1)/(x2-x1)
    let n = y1-x1*m
    fun x -> m*x+n

我想对这个函数进行单元测试,但我还没有找到怎么做,因为我不能在一个相等的断言中使用一个函数。我已经考虑过生成随机点的安全性并测试函数的应用程序与每个点的预期结果,但我想知道是否有更好的方法。

1 个答案:

答案 0 :(得分:1)

我会使用基于属性的测试方法(请参阅http://fsharpforfunandprofit.com/pbt/以获得精彩的介绍)。

你可能想要检查,对于任何输入(x1,y1)和(x2,y2),结果函数满足以下属性:

  • f(x1)= y1
  • f(x2)= y2
  • f是线性的

如果功能满足,则必须正确。

您可以轻松查看前两个。对于最终属性,您可以选择一些随机x值进行测试。

重复选择输入,你就完成了。正如Carsten所提到的,FsCheck可用于使用大量随机生成的测试用例自动测试这些属性。