繁体   English   中英

单元测试中断言的最佳实践

[英]Best practices for assertions in Unit Testing

我正在尝试测试一个以三个参数作为输入的应用程序(A面,B面,C面)并计算三角形isoscele(两边相等),scalene(两边都不相等)或等边(所有双方是平等的)。

下面是我正在进行的单元测试的一些代码。 在这种情况下,我正在测试应用程序告诉用户三角形是等速的,我的问题是在这种情况下断言之后应该有什么? AreNotSame适用于scalene,AreSame适用于等边,但这里有什么用? 提前致谢。

    public void isIsoscelesTest()
    {
        Triangle target = new Triangle(5.0, 5.0, 2.0); // TODO: Initialize to an appropriate value
        bool expected = true; // TODO: Initialize to an appropriate value
        bool actual;
        actual = target.isIsosceles();
        Assert.AreNotSame(expected, actual);
    }

//来自应用程序......

    public bool isIsosceles() {
      if(uniqueSides()==2)
        return true;
      return false;
    }

理想情况下,您应该为每个测试用例创建一个测试,因此在您的示例中,我可能会有

[Test]
public void isIsoscelesTest()     
{ 
    var triangle = new Triangle(5.0, 5.0, 2.0); 
    Assert.That(triangle.isIsoceles(), Is.True);
    Assert.That(triangle.isEquilateral(), Is.False);
    Assert.That(triangle.isScalene(), Is.False);
}

以及

[Test]
public void isScaleneTest()     
{ 
    var triangle = new Triangle(3.9, 5.0, 2.0); 
    Assert.That(triangle.isIsoceles(), Is.False);
    Assert.That(triangle.isEquilateral(), Is.False);
    Assert.That(triangle.isScalene(), Is.True);
}

[Test]
public void isEquilateralTest()     
{ 
    var triangle = new Triangle(3.9, 3.9, 3.9); 
    Assert.That(triangle.isIsoceles(), Is.False);
    Assert.That(triangle.isEquilateral(), Is.True);
    Assert.That(triangle.isScalene(), Is.False);
}

我个人会在每个测试中声明它是一个特定类型,但不是其他两种类型,但是你也可以将它们分成不同的测试用例(然后它会变得冗长)。

在上面的例子中,我们有一些(几乎)重复的代码,如果需要,可以将它们分解为辅助方法。 此外,我们只测试三个单独的变量组合(边长)。 如果你把任何其他值放在那里怎么办? 好的,我们不能测试一切,但它让你大致了解单位测试的数值缺点。

最后,请注意,使用double或float精度时,==运算符并不总是生成true。 例如,尝试以下代码:

[Test]
public void DoublePrecisionRoundingTest()
{
   double aValue = 1.2345678;
   Assert.That(aValue + double.Epsilon, Is.EqualTo(aValue)); // passes! Should fail
}

这样做的原因是,在双精度中,舍入误差可能导致一些数值运算被消灭。 作为一种解决方法(这会影响您的三角形代码),您应该始终使用double或float变量测试“足够近”。

例如,而不是在Triangle.uniqueSides方法中的这个:

if (aDouble == otherDouble) 

建议(但并非总是必要)使用它

if(Math.Abs(aDouble - otherDouble) < EPSILON)

其中EPSILON的价值非常小。

最好的祝福,

暂无
暂无

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

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