【问题标题】:Parameterized tests vs Test method for each case NUnit每个案例 NUnit 的参数化测试与测试方法
【发布时间】:2021-10-28 00:18:33
【问题描述】:

我正在看 NUnit 的课程,我来这个练习是为了写一个下面函数的测试方法

public static string GetOutput(int number)
    {
        if ((number % 3 == 0) && (number % 5 == 0))
            return "FizzBuzz";

        if (number % 3 == 0)
            return "Fizz";

        if (number % 5 == 0)
            return "Buzz";

        return number.ToString(); 
    }

我所做的是我创建了一个参数化测试来涵盖以下所有情况

 [Test]
    [TestCase(15 , "FizzBuzz")]
    [TestCase(3, "Fizz")]
    [TestCase(5, "Buzz")]
    public void GetOutput_WhenCalled_ReturnString(int number , string word)
    {
        var result = FizzBuzz.GetOutput(number);
        Assert.That(result, Is.EqualTo(word));
    }

但是导师已经用单独的方法编写了每个案例,例如

public void GetOutput_NumberDivisiableNy3And5_ReturnFizzBuzz()
{
    var result = FizzBuzz.GetOutput(15);
    Assert.That(result, Is.EqualTo("FizzBuzz"));
}

public void GetOutput_NumberDivisiableBy3_ReturnFizz()
{
    var result = FizzBuzz.GetOutput(3);
    Assert.That(result, Is.EqualTo("FizzBuzz"));
}

我的问题是他为什么这样写?像这样分开它有什么好处吗? 还是仅仅是个人喜好。我对单元测试和 Nunit 很陌生

【问题讨论】:

    标签: c# unit-testing nunit


    【解决方案1】:

    这是个人喜好。

    测试时的一个重要准则是,您为测试选择的名称应描述针对给定输入测试的方法的所需行为。将测试名称想象成类似于可执行文档:“在情况 X 下,该方法应该表现出行为 Y。”

    使用参数化测试意味着测试名称本质上不太具有描述性,这使得一目了然地准确识别失败的原因变得更加困难——您必须查看测试参数以确定失败的情况,因为测试名称未向您提供该信息。

    即使在您的实现中也很明显:您的测试名称显示为“returns string”“when called”。这在技术上是正确的,但不是描述性。当使用给定值调用时,它应该返回什么字符串应该

    另一方面,各个测试用例使期望的行为非常明确:可被 3 和 5 整除的数字应该返回“FizzBu​​zz”,等等。

    另外,请这样想:如果要求您返回此方法并将其扩展为打印 Fuzz,当一个数字可以被 7 整除时会发生什么? Biz 能被 9 整除吗?等等。您的单一测试方法可以完成所有繁重的工作,但是您拥有的要求越多,该单一测试用例的负担就越大,并且越难清楚地确定哪些场景失败和为什么。

    您的方法没有错,但是如果我正在编写这些测试,我会为每个场景编写一个测试用例:Fizz、Buzz、FizzBu​​zz,并且不能被任何东西整除。

    每个测试用例仍然可以参数化,因此您可以测试更多满足每个测试用例的值。

    【讨论】:

      【解决方案2】:

      归根结底,这是个人喜好。但是,当您正在测试的方法需要一个参数时,使用参数化测试似乎很自然。 OTOH,不要使用参数化测试来为两个或更多完全不同的事物编写测试......事实上,一次不要为多个目的编写测试!

      我的猜测是,您的讲师正在尝试从基本方法开始,并且只会在后面的课程中介绍参数化测试。但这当然只是猜测。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-16
        相关资源
        最近更新 更多