【问题标题】:Actual And Expected values are same but unit test fails. Why?实际值和预期值相同,但单元测试失败。为什么?
【发布时间】:2013-09-07 15:33:12
【问题描述】:

我正在尝试学习 VS 2012 上的单元测试并尝试了这个:

 public class Calculator
 {
    public double substraction(double num1, double num2)
    {
        return num1 - num2;
    }
 }

我的测试班在这里:

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void calc_substract()
    {
        var calculator = new Calculator();
        Assert.AreEqual<double>(calculator.substraction(5.3, 1.1), 4.2);
    }
}

给出这个错误:

Test Name:  calc_substract
Test FullName:  MyUnitTest.UnitTest1.calc_substract
Test Source:    d:\Users\...
Test Outcome:   Failed
Test Duration:  0:00:00,0068363

**Result Message:   Assert.AreEqual failed. Expected:<4,2>. Actual:<4,2>.**

如您所见,值相同但测试失败。你知道为什么吗?

【问题讨论】:

    标签: unit-testing visual-studio-2012 assert


    【解决方案1】:

    很奇怪,我想知道这是否是精度损失问题,因为您使用的是双精度 - 尽管这些值似乎无害,不会引发精度问题。

    另外,很棒的结果信息:)。

    如果你要求它比较 4.2 和 4.2,它至少通过了吗:

    Assert.AreEqual<double>(4.2, 4.2);
    

    ?

    如果您插入一些四舍五入,也会很想知道会发生什么:

    Assert.AreEqual<double>(Math.Round(calculator.substraction(5.3, 1.1),1), 4.2);
    

    另外,考虑使用decimal 而不是double,因为它具有更高的精度并且更自然地表示精确的小数,因此您应该发现使用decimal 可以避免特定测试等情况的精度问题 - 尽管这不是说其他更复杂的情况,即使使用decimal 也不会出现精度问题

    【讨论】:

    • 在尝试 Math.Round() 测试通过后!但为什么?应该没有小数从 5.3 中减去 1.1.. 无论如何谢谢!
    • 您总是冒着浮点计算出现精度问题的风险。
    猜你喜欢
    • 2012-08-17
    • 1970-01-01
    • 2021-07-03
    • 2022-01-23
    • 2021-07-29
    • 2020-10-09
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多