如何确保完整的单元测试覆盖率?

时间:2014-12-18 18:57:57

标签: c# visual-studio unit-testing reflection tdd

我有两个项目,一个是" Main"项目和另一个是"测试"项目

策略是主项目中的所有方法必须在测试项目中至少有一个附带测试。

我想要的是Test项目中的一个新单元测试,它验证了这种情况。如果有任何方法没有相应的测试(这包括方法重载),那么我希望这个测试失败。

我可以在测试失败时找出适当的消息。

我的猜测是我可以获得所有方法(使用反射??)但我不确定如何验证此测试项目中是否存在对每个方法的引用(并忽略项目中的引用)< / p>

2 个答案:

答案 0 :(得分:2)

您可以使用任何现有软件来衡量代码覆盖率,但......

不要这样做!认真。目标应该不是100%覆盖,而是拥有可以轻松发展的软件。从您的测试项目中,您可以通过反射每个现有方法来调用并吞下所有异常。这将使你的报道率达到100%左右,但会有什么好处呢?

了解TDD。开始创建可测试的软件,该软件具有有意义的测试,可在出现问题时为您节省时间这不是关于报道,而是关于安全。

答案 1 :(得分:1)

这是一个原则上听起来不错的元测试的例子,但是一旦你了解了细节,你应该很快意识到这是一个坏主意。正如已经提出的那样,正确的方法是鼓励拥有该政策的人修改它。正如您所引用的政策一样,它足够具体,人们可以满足要求而不会真正实现任何有价值的东西。

考虑:

public void TestMethod1Exists()
{
    try
    {
        var classUnderTest = new ClassToTest();
        classUnderTest.Method1();
    }
    catch (Exception)
    {
    }
}

测试包含对Method1的{​​{1}}的调用,因此满足了对该方法进行测试的要求,但是没有任何有用的测试。只要该方法存在(如果编译的代码必须这样),测试就会通过。

该策略的目的可能是尝试确保正在测试编写的代码。看一些非常基本的代码:

ClassToTest

随着方法的进行,这非常简单(可以很容易地改为一行),但即使这样,它也包含两个通过该方法的路径。进行测试以确保调用此方法会给您一种错误的安全感。您会知道它正在被调用,但您不知道是否正在测试所有代码路径。

建议的替代方案是您可以使用代码覆盖工具。这些可能很有用,可以更好地了解您的代码运行情况,但同样,它们只能说明覆盖范围,而不是覆盖范围的质量。所以,假设我对上面的public string IsSet(bool flag) { if (flag) { return "YES"; } return "NO"; } 方法进行了一些测试:

IsSet

我传递了足够的参数来练习两个代码路径,因此public void TestWhenTrue() { var classUnderTest = new ClassToTest(); Assert.IsString(classUnderTest.IsSet(true)); } public void TestWhenFalse() { var classUnderTest = new ClassToTest(); Assert.IsString(classUnderTest.IsSet(false)); } 方法的覆盖率应为100%。但我测试的是该方法返回一个字符串。我没有测试字符串的值,所以测试本身并没有真正添加很多(如果有的话)值。

代码覆盖率是一个有用的指标,但仅作为代码质量的更大图片的一部分。通过同行评审并分享有关如何有效测试您在团队中编写的代码的最佳实践,同时不太具体可测量将对测试代码的质量产生更显着的影响。