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

本文关键字:最佳 中断 断言 单元测试 | 更新日期: 2023-09-27 18:19:27

我正在尝试测试一个应用程序,该应用程序以三个参数作为输入(A侧、B侧、C侧),并计算三角形是等腰(两边相等)、不等边(没有一条边相等)或等边(所有边相等)。

下面是我正在进行的单元测试中的一些代码。在这种情况下,我正在测试应用程序告诉用户三角形是等腰的,我的问题是在这种情况中,在Assert之后应该有什么?AreNotSame适用于斜角肌,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);
}

就我个人而言,我会在每个测试中断言它是一个特定的类型,但不是其他两种类型,但是你也可以将它们分为单独的测试用例(然后它会变得冗长)。

在上面的例子中,我们有一些(几乎)重复的代码,如果需要的话,可以将其分解为一个helper方法。此外,我们只测试三个独立的变量组合(边长)。不过,如果你把其他值放进去呢?好吧,我们不能测试所有的东西,但它让你大致了解了用数值进行单元测试的缺点。

最后,请注意,当使用双倍精度或浮动精度时,==运算符并不总是产生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是一个非常小的值。

致问候,