我有以下单元测试:
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'的值是相等的:
预期和实际分别推断为浮动和双倍,但我认为浮动简单地说是双倍的简写。 对此有任何解释吗?
修改 根据@ Gustavo的评论,我已将最后一行更改为:
Assert.AreEqual(expected, actual, 0.000000000000001)
并且测试通过。
答案 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 @>