繁体   English   中英

C#NUnit单元测试未使用正确的方法返回进行比较

[英]C# NUnit unit test not using correct method return to compare

我有以下课程

public static class MyClass
{
    public static double Converter(int mpg)
    {
       return Math.Round((double)mpg / ((double)36 / 12.74), 2);
    }
}

和NUnit单元测试

[TestFixture]
public class ConverterTests
{
    [Test]
    public void Basic_Tests()
        Assert.AreEqual(8.50, MyClass.Converter(24));
    }
}

我的单元测试因

Expected: 8.5d
But was:  8.4900000000000002d

当我调试方法返回8.49时,单元测试在哪里从末尾得到2的长整数?

单元测试显示的结果与执行代码时所见相同。 这是一个简短但完整的程序,用于显示使用DoubleConverter类检索到的确切结果。

using System;

class Test
{
    static void Main()
    {
        double x = Convert(24);
        Console.WriteLine(DoubleConverter.ToExactString(x));
    }

    static double Convert(int mpg)
    {
        return Math.Round((double) mpg / ((double) 36 / 12.74), 2);
    }
}

结果:

8.4900000000000002131628207280300557613372802734375

使用计算器,我希望未取整的结果为8.4933333-当四舍五入到小数点后两位时,它的确会取整为“约8.49”。

因此,真正的问题是,为什么在调试器中看到8.5,而不是为什么单元测试失败。 我自己没有看到该消息,因此您可能希望准确地研究调试方式。 调试时,您可能会看到不同的结果,因为:

  • 在调试中,您可能使用了不同的浮点操作,例如,“纯” 64位而不是.NET允许的80位中间操作。
  • 您可能正在调试将处理器的浮点模式设置为32位的其他代码。 我已经看到在使用DirectX时会发生这种情况,但是我希望您知道自己正在这样做
  • 调试器可能会以截断的形式显示结果,尽管我不希望它将那个数字截断为8.5。

'double'是操纵分数的肮脏技巧 ... :-)

谈论双打时,绝对不要测试是否相等。

正确的测试方法是:

Math.Abs(8.50 - MyClass.Converter(24)) < TOLERANCE

“公差”是指接受多少差异。

例如

for TOLERANCE == 0.001
8.5004 == 8.50
8.4995 == 8.50

for TOLERANCE == 0.01
8.504 == 8.50
8.495 == 8.50

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM