【问题标题】:Method with string input, why does unit test does not cover all blocks带字符串输入的方法,为什么单元测试没有覆盖所有块
【发布时间】:2017-07-19 09:17:24
【问题描述】:

我有一个将字符串作为输入的方法,检查它是否不为空并且字符串的长度是否大于零,然后根据字符串是否包含另一个字符串返回 Enums。 (下面显示了 11 个 if 语句中的 5 个)

public static sapActivityEnums CheckString(string input)
{
    if(!input.IsNullOrEmpty(input))
    {
        if(input.Contains("DailySap"))
        {
            return sapActivityEnums.Daily;
        }

        if(input.Contains("WeeklySap"))
        {
            return sapActivityEnums.Weekly;
        }

        if(input.Contains("MonthlySap"))
        {
            return sapActivityEnums.Monthly;
        }

        if(input.Contains("QuarterltSap"))
        {
            return sapActivityEnums.Quarterly;
        }

        if(input.Contains("YearlySap"))
        {
            return sapActivityEnums.Yearly;
        }
    }

    return sapActivityEnums.Unassigned;
}

我执行的测试是:空输入,空输入,输入字符串包含条件,输入字符串不包含条件..

[Test()]
public void CheckStringIsNullTest()
{
    string input = null;
    sapActivityEnums expectedResult = sapActivityEnums.Unassigned;

    Assert.AreEqual(expectedResult, Util.CheckString(input);
}


[Test()]
public void CheckStringIsEmptyTest()
{
    string input = string.Empty;
    sapActivityEnums expectedResult = sapActivityEnums.Unassigned;

    Assert.AreEqual(expectedResult, Util.CheckString(input);
}


[Test()]
public void CheckStringCorrectParmTest()
{
    string input = "WeeklySapReport_07_02_2107_25437865.xlsx";
    sapActivityEnums expectedResult = sapActivityEnums.Weekly;

    Assert.AreEqual(expectedResult, Util.CheckString(input);
}



[Test()]
public void CheckStringIncorrectParmTest()
{
    string input = "Weekly_SapReport_07_02_2017_25437865.xlsx";
    sapActivityEnums expectedResult = sapActivityEnums.Unassigned;

    Assert.AreEqual(expectedResult, Util.CheckString(input);
}

这给了我 80% 的代码覆盖率。我只是好奇为什么没有涵盖所有代码块。我是否必须对包含“WeeklySap”、“DailySap”等的输入字符串进行测试?完整的方法检查 10 个条件,所以我需要 10 个测试吗?

【问题讨论】:

  • 请发帖minimal reproducible example。这显然不是你的真实代码,因为它不会编译,而且你没有展示你正在使用的测试。我还希望您的代码覆盖工具能够向您展示未覆盖的区域。
  • "我是否必须对包含 test1 的输入字符串进行测试,对包含 test2 的字符串进行另一个测试?"那么他们会测试不同的代码路径,不是吗?
  • 只是附注if (!string.IsNullOrEmpty(input))
  • 这不是精通编码的问题。这是在提出问题之前进行尽职调查的问题。如果你不在你的机器旁,所以不能问一个好问题,那很好......答案是等到你可以问一个好问题而不是问一个坏问题。请记住,Stack Overflow 的目的不是让您尽快得到答案 - 它是建立一个好的问题和答案的存储库。实现该目标的正确方法是花时间提出问题。
  • "额外的行有什么不同?"他们会证明你正在测试你认为你正在测试的东西,一方面。同样,如果您发布了有效代码,则更有可能是您的 实际 代码 - 鉴于您尚未发布您的 实际 代码,我们无法知道您的实际代码和实际代码之间可能存在哪些重要差异。如果你有兴趣学习,这是你可以从这个问题中学到的最重要的东西:如何提出更好的问题。

标签: c# unit-testing


【解决方案1】:

您将需要针对每个场景进行测试,并需要一个测试用例来运行它。如果您在没有两个测试用例的情况下运行测试,那么只会运行 1 个测试。此外,如果您正在测试与枚举同名的字符串,您可能有兴趣尝试将字符串解析为枚举如果失败返回未分配的枚举。 Switch 的代码速度更快,但编写起来更慢,并且引入了更多需要关注的地方。

您实际上并不需要进行 10 次单独的测试。请看一下TestCase:https://github.com/nunit/docs/wiki/TestCase-Attribute。使用不同测试用例初始化的一项测试可以解决您的问题。

希望对你有帮助

【讨论】:

  • 谢谢。这些字符串取自用户选择的文件,因此它们与我的枚举不同。我制作了一个可接受的文件名列表来测试,因为这只是验证过程的一部分。本来打算使用 switch 语句,但是当我在字符串上执行 contains 时(因为完整的文件名不是静态的),我不能。我知道这是 c# 7.0 的一个特性,但我们没有使用它。
【解决方案2】:

是的。代码覆盖执行所有测试并记住它在执行时通过了哪些代码行(或者更具体地说是哪些表达式)。

这个传递的表达式是你的代码覆盖率。要获得 100% 的代码覆盖率,您的单元测试需要访问生产源中的所有语句。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-11
    • 2014-01-23
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 2017-12-14
    • 2014-04-06
    • 1970-01-01
    相关资源
    最近更新 更多