F#Assert.AreEquals失败了两个文字

时间:2014-10-01 13:20:42

标签: unit-testing f#

我有以下单元测试:

open System
open System.Collections.Generic
open Microsoft.VisualStudio.TestTools.UnitTesting

[<TestClass>]
type Test_Spectra () =

    let standard = new Standard1()

    [<TestMethod>]
    member x.LightTransmittance () =

        let input = Test_Spectra.TestSprectra1
        let expected = 0.32728222797751
        let actual = standard.LightTransmittance(input)

        Assert.AreEqual(expected, actual)

当我运行单元测试时,它会失败,但'expected'和'actual'的值是相等的:

lightTransmittanceFails

预期和实际分别推断为浮动和双倍,但我认为浮动简单地说是双倍的简写。 对此有任何解释吗?

修改 根据@ Gustavo的评论,我已将最后一行更改为:

Assert.AreEqual(expected, actual, 0.000000000000001)

并且测试通过。

2 个答案:

答案 0 :(得分:6)

浮点值的平等是棘手的,因为小的舍入差异足以导致不等式。

当至少其中一个数字来自计算时,使用相等来比较代码中的两个浮点数通常是一个坏主意。这同样适用于单元测试。

您通常做的是定义您的容忍度和使用比较,而不是相等。

    let input = Test_Spectra.TestSprectra1
    let expected = 0.32728222797751
    let actual = standard.LightTransmittance(input)

    let tolerance = 0.000000000000001

    Assert.AreEqual(expected, actual, tolerance)

答案 1 :(得分:2)

对于F#,advantages of unquote很难被忽略。

例如,如果您想写一些与@ Gustavo类似的答案,您可以使用以下内容:

// In helpers somewhere or I'm sure some lib has relevant functions
let inline equalsWithinTolerance x tol y = abs(x-y) < tol

test <@ expected |> equalsWithinTolerance .000001 actual @>

let inline (~=) x = equalsWithinTolerance x .00000001
test <@ expected ~= actual @>