我在VS 2015 (和一般的单元测试)中对Intellitest相当陌生,我正在尝试使用它来测试一种在英寸和毫米之间转换的简单方法。
我知道Intellitest在浮点测试方面有局限性。我如何处理这些问题,理想情况下不完全超出框架?我正在成功地将其用于代码的其余部分,因此我希望找到一个尽可能匹配相同方法的解决方案。
我在一个类中有两个属性:
public double CutLengthInInches
{
get;
set;
}
public double CutLengthInMM
{
get
{
return CutLengthInInches * 25.4;
}
set
{
CutLengthInInches = value / 25.4;
}
}然后,我使用Intellitest创建一个存根,填充如下:
[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()调用。这件事的最佳解决办法是什么?
发布于 2016-04-25 10:20:49
您的断言正在对浮点值进行精确的比较。无论是否使用IntelliTest,您都应该避免这种比较。应用程序依赖于精确的浮点比较是不安全的;舍入的细微变化会改变这种比较的结果,从而导致意外的行为(例如,测试用例失败!)
相反,对于浮点数量相等的测试应该在与预期的计算精度有关的某种公差内进行(即比较这些值是否“足够”)。
例如,如果您使用double.Epsilon作为您的容忍度,那么将比较更新为:(Math.Abs(value - target.CutLengthInMM) < double.Epsilon)。
现在开始使用IntelliTest:,当IntelliTest观察到代码进行这样精确的比较时,它会用可测试性警告来标记它们。继续使用上述容忍值,将您的断言更新如下:
PexAssert.IsTrue(Math.Abs(value - target.CutLengthInMM) < double.Epsilon);您将看到一个警告,即对Math.Abs的调用未被检测到。这没关系(因为我们对测试该方法不感兴趣)。在确保您已经解决了任何其他此类问题之后,您可以选择并取消警告(单击“探索结果”窗口工具栏上的“取消”按钮)。
https://stackoverflow.com/questions/36813614
复制相似问题