首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Intellitest测试浮点输出?

如何使用Intellitest测试浮点输出?
EN

Stack Overflow用户
提问于 2016-04-23 16:46:28
回答 1查看 230关注 0票数 0

我在VS 2015 (和一般的单元测试)中对Intellitest相当陌生,我正在尝试使用它来测试一种在英寸和毫米之间转换的简单方法。

我知道Intellitest在浮点测试方面有局限性。我如何处理这些问题,理想情况下不完全超出框架?我正在成功地将其用于代码的其余部分,因此我希望找到一个尽可能匹配相同方法的解决方案。

我在一个类中有两个属性:

代码语言:javascript
复制
public double CutLengthInInches
{
    get;
    set;
}

public double CutLengthInMM
{
    get
    {
        return CutLengthInInches * 25.4;
    }
    set
    {
        CutLengthInInches = value / 25.4;
    }
}

然后,我使用Intellitest创建一个存根,填充如下:

代码语言:javascript
复制
[PexMethod]
public void CutLengthInMMSet([PexAssumeUnderTest]CutPiece target, double value)
{
    target.CutLengthInMM = value;
    PexAssert.AreEqual(value, target.CutLengthInMM);
    PexAssert.AreEqual(value, target.CutLengthInInches * 25.4);
}

当我运行这个程序时,Intellitest发出了一个错误:

以下操作涉及分支情况: 浮点相等 此操作会导致可测试性问题,无法生成输入以覆盖调用后的代码。

它指向的行是第一个AreEqual()调用。这件事的最佳解决办法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-25 10:20:49

您的断言正在对浮点值进行精确的比较。无论是否使用IntelliTest,您都应该避免这种比较。应用程序依赖于精确的浮点比较是不安全的;舍入的细微变化会改变这种比较的结果,从而导致意外的行为(例如,测试用例失败!)

相反,对于浮点数量相等的测试应该在与预期的计算精度有关的某种公差内进行(即比较这些值是否“足够”)。

例如,如果您使用double.Epsilon作为您的容忍度,那么将比较更新为:(Math.Abs(value - target.CutLengthInMM) < double.Epsilon)

现在开始使用IntelliTest:,当IntelliTest观察到代码进行这样精确的比较时,它会用可测试性警告来标记它们。继续使用上述容忍值,将您的断言更新如下:

代码语言:javascript
复制
PexAssert.IsTrue(Math.Abs(value - target.CutLengthInMM) < double.Epsilon);

您将看到一个警告,即对Math.Abs的调用未被检测到。这没关系(因为我们对测试该方法不感兴趣)。在确保您已经解决了任何其他此类问题之后,您可以选择并取消警告(单击“探索结果”窗口工具栏上的“取消”按钮)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36813614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档