代码覆盖率分析

ama*_*eur 0 c# asp.net unit-testing code-coverage

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

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

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

dth*_*rpe 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

不要误解我的意思 - 在鲨鱼坦克玩耍之前,单位测试对于理智检查你的工作至关重要.代码覆盖分析是一个非常强大的工具来快速确定哪些代码的地区从来没有见过天日,可能值得多一点的注意力发布之前.

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