代码覆盖率-使用[ExcludeFromCodeCoverage]排除结果中不需要关注的代码

2012-11-23  籽藤 

最近花了很多时间在分析代码覆盖率的数据。代码覆盖率是衡量测试用例完善与否的一个度量标准。一般来说,最少要达到80%的覆盖率。

如果项目是在本地运行的,无论测试程序是否是直接调用待测DLL,我们都可以拿到覆盖率结果。这一点可以参考我在播布客上的视频:http://www.boobooke.com/v/bbk7054

但作为一个云项目,我们所开发的产生的包,会发布到云端。尽管我们可以把Service先部署在本地的IIS Express上进行测试,但本地环境和云环境毕竟不同,RoleEnvironment.IsAvailable可以判断当前的role instance 是否运行在Azure环境中,那些只在Azure环境中运行的代码,在本地就无法拿到覆盖率的数据。在这种情况下,我们就可以使用[ExcludeFromCodeCoverage]标签属性,在收集代码覆盖率数据的过程中,把这些不需要关注的代码排除在外。在最终的结果中,不会出现这些代码的覆盖率数据,也就不会影响总体数据,便于分析。  

一般来说,有以下三类情况会使用[ExcludeFromCodeCoverage]

  1. 编译器或工具自动生成的代码
    1. 比如:在VS中创建一个WCF项目,会自动创建GetData方法。当然,作为测试人员,你可以为这个Unused Code报个Bug,但是大部分开发都不愿对代码做删改。
  1. 其他人/Team提供的代码
    1. 覆盖率的收集,是基于Binary的。也就是说,如果你和其他人/team的代码编译到同一个DLL中,但目前只需要拿到你负责功能的测试代码覆盖率,那结果肯定会受影响。
  1. 已经很稳定的旧代码的重构
    1. 我在项目中没遇到这种情况,额,可能是因为项目二期的时候我都闪人了。MSDN提到了这种情况:Excluding the refactoring of proven stable legacy code. http://msdn.microsoft.com/en-us/library/dd984116(v=vs.100).aspx

 

扯了一大通,其实[ExcludeFromCodeCoverage]用法很简单:

 

Demo 1:

 

[ExcludeFromCodeCoverage]
    class simpleMath
    {
        public int addTwoNumbers(int firstNumber, int secondNumber)
        {
            int total = firstNumber + secondNumber;
            return total;
        }

public int subtractTwoNumbers(int firstNumber, int secondNumber)
        {
            int total = firstNumber - secondNumber;
            return total;
        }
    }

 

Demo 2:

 

public class Date
{
    private int month = 7;  // Backing store

public int Month
    {
        get
        {
            return month;
        }
        [ExcludeFromCodeCoverage]
        set
        {
            if ((value > 0) && (value < 13))
            {
                month = value;
            }
        }
    }
}

795°/7959 人阅读/0 条评论 发表评论

登录 后发表评论