字符串输入的方法,单元测试为什么不覆盖所有块

时间:2017-07-19 09:17:25

标签: c# unit-testing

我有一个方法,它接受一个字符串作为输入,检查它不是null,并且字符串的长度大于零,然后根据字符串是否包含另一个字符串返回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"等的输入sting进行测试。完整方法检查10个条件,那么我需要进行10次测试吗?

2 个答案:

答案 0 :(得分:0)

是。代码覆盖率执行所有测试并记住它在执行时传递的代码行(或更具体的表达式)。

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

答案 1 :(得分:0)

您需要为每个方案和测试用例进行测试才能运行此测试。如果您在没有两个测试用例的情况下运行测试,则只会运行一个测试。此外,如果您正在测试与您的枚举具有相同名称的字符串,您可能有兴趣尝试将字符串解析为枚举如果失败则返回未分配的枚举。切换代码更快,但编写速度更慢,并引入了更多需要照顾的地方。

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

希望这有帮助