【问题标题】:Unit testing float operations in Visual Studio 2008 ProVisual Studio 2008 Pro 中的单元测试浮动操作
【发布时间】:2010-10-27 02:36:27
【问题描述】:

我有一些执行浮点/双精度操作的 C# 单元测试,我想对它们进行单元测试。由于舍入错误,Assert.AreEqual 不足。

以单位换算为例。 10.5 米到英尺的转换系数为 3.281,所以我得到 34.4505。使用更准确的转换因子给我 34.4488189。我想在 0.1 内测试这个(所以 34.3488-34.5488 会通过测试)。

我可以确定在我的单元测试中手动测试带有容差的值,但这是高度重复的,并且失败消息的描述性不是很好(再次不必编写我自己的断言失败消息):

Assert.IsTrue(Math.Abs(34.4488189 - value) < 0.1);

如何在一定的容错范围内对浮点操作进行单元测试? 我找不到任何 VS 附带的 Assert 类。我错过了还是必须自己动手?

在测试浮点数/双精度数时是否有标准做法需要牢记?

【问题讨论】:

    标签: c# unit-testing .net-3.5 floating-point


    【解决方案1】:

    您可以查看NUnit 框架:

    //Compare Float values
    Assert.AreEqual(float expected, float actual, float tolerance);
    Assert.AreEqual(float expected, float actual, float tolerance, string message);
    
    //Compare Double values
    Assert.AreEqual(double expected, double actual, double tolerance);
    Assert.AreEqual(double expected, double actual, double tolerance, string message)
    

    (以上摘自this文章)

    更多列表here

    【讨论】:

      【解决方案2】:

      看看 NUnit Equality Constraints,它们很灵活!希望对您有所帮助!

      【讨论】:

        【解决方案3】:

        MSTest 中的 Assert.AreEqual 具有接受 delta(容错)参数的重载:

        public static void AreEqual (double expected, double actual, double delta)
        

        例如:

        Assert.AreEqual(34.4488189, value, 0.1);
        

        或者,对于尽可能小的公差:

        Assert.AreEqual(34.4488189, value, double.Epsilon);
        

        【讨论】:

        • 哈! AreEqual 的 18 个重载。难怪我没抓住它。
        • 警告,使用double.Epsilon 不会做你想做的事。 Epsilon 是最小的双精度值。这仅适用于比较 10^-324 量级的值,这不太可能。您要做的是将双精度值与它们可以表示的最后一位进行比较。因此,如果您比较的是千万亿级的值,则容差可能是一千。流行语是“ULP”(排在最后的单位)。见cygnus-software.com/papers/comparingfloats/comparingfloats.htm
        • 如果你使用 XUnit,Assert.Equal() for doubles 采用类似但不同的第三个参数:precision,它是一个指定小数位数的 整数关心。
        【解决方案4】:

        我正在使用手机,请原谅缺少代码/链接。

        这里有一个关于人们最喜欢的 c# 扩展的问题,其中人们扩展了内置类型,例如字符串。您可以使用这样的方法扩展浮点类型:

        Myfloat.IsInTolerance(34.8f, 0.1f)
        

        ..如果 Myfloat 浮点数在 34.8 的任一侧为 0.1,则返回 true。它可以使它不那么费力。

        【讨论】:

          【解决方案5】:

          NUnit 可以通过提供 AreEqual 方法的第三个参数在容差范围内进行比较。看看NUnit Equality Asserts

          Visual Studio 单元测试也有这个:AreEqual Method (Double, Double, Double, String)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-10-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多