Visual Studio单元测试:为什么测试运行不确定而测试相同的浮点值?

时间:2010-09-23 11:43:59

标签: c# visual-studio unit-testing

我正在学习VS单元测试并尝试过这个:

    [TestMethod()]
    public void calcTest()
    {
        double expected = 1.234F; // TODO: Initialize to an appropriate value
        double actual;
        actual = 1.234F;
        Assert.AreEqual(expected, actual);
        Assert.Inconclusive("Verify the correctness of this test method.");
    }

运行此测试方法时,它表示不确定???为什么?

更新:嗨,大家好,可以告诉我们不要比较花车,但业务要求就是它们,所以如果我需要比较它们该怎么办?

你是说在没有头痛的情况下测试浮动计算是不可能的吗?那么,如果测试是如此令人头疼的财务计算不是最好不进行测试吗?

看起来像是一个巨大的bug或设计缺陷在vs测试框架而不是:)正如这里所说的那样 http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.assert.inconclusive%28VS.80%29.aspx

表示无法证明断言是真还是假。

因为我比较了2个相同的litteral确定它是真的!

4 个答案:

答案 0 :(得分:17)

嗯,因为你告诉它了?

Assert.Inconclusive("Verify the correctness of this test method.");

现在您已拥有AreEqual,您应该可以删除此Inconclusive

测试期间的任何失败(不包括您有意处理的异常)通常是终端,但传递的任何断言(如此处的AreEqual)继续跑步所以第一次测试通过,然后最后一行将其标记为不确定。

答案 1 :(得分:8)

即使您已移除Assert.Inconclusive,您仍可能遇到问题。

您正在测试两个浮点数的相等性,而通常使用计算值,您永远不会让它们完全相同。您需要检查实际值是否在预期值的可接受范围内:

Math.Abs(actual - expected) < 0.00001;

例如。

您的Assert.AreEqual(expected, actual);在这种情况下有效,因为您为两个变量分配了相同的值。

答案 2 :(得分:2)

这不仅仅意味着AreEqual通过,这意味着它被称为Assert.Inconclusive,导致结果不确定?

来自the docs

  

与Fail相似,表示   如果没有,断言是不确定的   检查任何条件。

如果您不希望结果具有包容性,请删除对Assert.Inconclusive:)的调用

答案 3 :(得分:2)

自动UnitTest由VS生成,并告诉您创建一些要比较的操作。如果您将评论最后一个Assert命令,您将获得带有绿色标记的“Passed”,但您没有对其进行测试 您需要,如在注释中“初始化为适当的值”,并在最后一个断言“验证此测试方法的正确性”中。 初始化它们来自的预期值和实际值 例如,Expected是函数Add(x,y)的期望值,其中x = 2且y = 3。实际值应来自该功能。在这种情况下:

// Sample - Start
Expected = 2+3;
Actual = Add(2,3);
Assert.AreEqual(expected, actual);
// Sample - End

希望它有所帮助,我为此打破了几颗牙齿......; - )

相关问题