代码覆盖率分析

时间:2011-11-14 23:41:09

标签: c# asp.net unit-testing code-coverage

我正在使用框架4.0中开发的asp.net Web表单项目。它目前没有任何单元测试。

我目前正在为该网站添加一项新功能,我希望在其中引入单元和集成测试。不熟悉代码覆盖的概念我希望在新功能中获得很高比例。

我将使用visual studio和rhino mocks提供的集成测试环境进行模拟生成。对于新功能,我应该达到什么级别的代码覆盖率?对于新手编码覆盖率,如何衡量网站的特定功能?

4 个答案:

答案 0 :(得分:7)

在单元测试中,可以始终如一地将代码覆盖率接近95%,但是您需要始终关注实际测试的内容以及减少嘲弄的内容。

通过有缺陷模拟的单元测试获得100%的代码覆盖率比完全没有测试覆盖率更糟糕。一个糟糕的模拟会导致虚假的安全感 - 你认为你知道你的代码在现实世界中的表现,而实际上你什么都不知道。因为你对这种虚假的知识充满信心,所以你知道的不是什么。如果你至少没有任何测试,那么你会担心作为你的向导。

模拟是一个很好的测试工具,但你必须记住,你的模拟永远不会超过你对现实世界的看法。您通常不会在现实世界代码的主流中发现问题。正是在回归的漩涡中,现实世界背离了理性的期望,而嘲笑会让你陷入虚假的安全感。

集成测试可以更好地掌握现实,因为您通常会在真实系统上运行。但是,在集成测试中模拟故障情况以扫除代码路径中的所有极端情况并挤出最后5%的代码覆盖率是非常困难的。单元测试擅长强制错误条件并执行代码的错误处理。

注意不要过多地阅读代码覆盖率统计信息。你知道他们说的是什么:谎言,该死的谎言和代码覆盖率统计数据。 ;>代码覆盖率数据是一个有价值的工具,可以深入了解您的单元测试正在做什么,但这不是一个绝对的事实。代码覆盖率结果可能表面上华而不实,但需要通过理解来调整。

很少有代码覆盖工具会告诉您整个故事。最简单的告诉你在测试运行期间的某个时间执行了一行代码。它们不会告诉您该行是否通过一大块代码在所有可能的代码路径上执行。部分原因是因为每个额外的if语句,代码路径排列的数量呈指数增长。这种增长程度难以管理,而且难以想象。

考虑以下代码:

public class Class1
{
    public static void foo(bool a, bool b)
    {
        int x = 100;
        if (a)
            Console.WriteLine("statement a");
        else
            x -= 50;

        if (b)
            Console.WriteLine("statement c");
        else
            x -= 50;

        double y = 10 / x;
    }
}

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
        Class1.foo(true, true);
        Class1.foo(true, false);
        Class1.foo(false, true);
    }
}

代码覆盖率会告诉您此代码段中的所有行都已由您的单元测试执行。

恭喜!您已获得100%代码覆盖率的荣誉徽章。哦,顺便说一下,你的代码仍然包含崩溃错误。

覆盖结果是正确的,因为单元测试确实练习了代码段中的每一行代码。但这不是完整的故事,而是完整的事实。通过同一执行上下文中的两个else子句的(a,b)=(false,false)的代码路径未由单元测试执行。这就是在现实世界中运行时会导致零错误除以的一条路径。

不要误解我的意思 - 在鲨鱼坦克玩耍之前,单位测试对于理智检查你的工作至关重要。代码覆盖率分析是一个非常强大的工具,可以快速确定代码的哪些区域从未曾经看到过白昼,并且在发布之前可能需要更多关注。

使用这些工具并仔细考虑他们的结果,他们将为您提供良好的服务。

答案 1 :(得分:2)

在我看来,代码覆盖率在进行单元测试时是一个误导性指标。高覆盖率并不能告诉您,您有良好的单元测试。实际上,在完全没有测试的情况下,很容易获得100%的覆盖率。此外,对于单元测试,有趣的覆盖范围是分支覆盖范围,但大多数工具都可以为您提供线路覆盖。

你应该做的是告诉自己如何正确完成TDD。通过适当的TDD,您可以获得良好的单元测试,并且您知道无需测量您的覆盖率非常好。

答案 2 :(得分:0)

你的问题有点奇怪。

代码覆盖率是一个标准,显示在特定运行中执行了多少代码。通常人们使用代码覆盖率作为评估单元测试质量的标准:在这种情况下,未覆盖的代码等于未经测试的代码。所以,每个人都希望看到100%。

在您的情况下,如果您有Premium或Ultimate,则可以直接在VS2010中使用具有相同目的的代码覆盖率:http://msdn.microsoft.com/en-us/library/ms243186.aspx

对于ASP.NET应用程序,您可能希望使用其他类型的测试,例如UI测试(用于webforms),负载测试等,您也可以(部分)生成并直接在VS2010中运行。

答案 3 :(得分:0)

测试让您对自己的功能充满信心,代码覆盖率让您对测试充满信心,当然,代码覆盖率也会增加您的信心。

但是请记住这种信心不是关于功能满足业务,而是关于你的代码不会因意外异常而爆炸