最近花了很多时间在分析代码覆盖率的数据。代码覆盖率是衡量测试用例完善与否的一个度量标准。一般来说,最少要达到80%的覆盖率。
如果项目是在本地运行的,无论测试程序是否是直接调用待测DLL,我们都可以拿到覆盖率结果。这一点可以参考我在播布客上的视频:http://www.boobooke.com/v/bbk7054
但作为一个云项目,我们所开发的产生的包,会发布到云端。尽管我们可以把Service先部署在本地的IIS Express上进行测试,但本地环境和云环境毕竟不同,RoleEnvironment.IsAvailable可以判断当前的role instance 是否运行在Azure环境中,那些只在Azure环境中运行的代码,在本地就无法拿到覆盖率的数据。在这种情况下,我们就可以使用[ExcludeFromCodeCoverage]标签属性,在收集代码覆盖率数据的过程中,把这些不需要关注的代码排除在外。在最终的结果中,不会出现这些代码的覆盖率数据,也就不会影响总体数据,便于分析。
一般来说,有以下三类情况会使用[ExcludeFromCodeCoverage]
- 编译器或工具自动生成的代码
- 比如:在VS中创建一个WCF项目,会自动创建GetData方法。当然,作为测试人员,你可以为这个Unused Code报个Bug,但是大部分开发都不愿对代码做删改。
- 其他人/Team提供的代码
- 覆盖率的收集,是基于Binary的。也就是说,如果你和其他人/team的代码编译到同一个DLL中,但目前只需要拿到你负责功能的测试代码覆盖率,那结果肯定会受影响。
- 已经很稳定的旧代码的重构
- 我在项目中没遇到这种情况,额,可能是因为项目二期的时候我都闪人了。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;
}
}
}
}