代码覆盖率分析器显示自动实现属性的getter未覆盖,是否可忽略?
解决Visual Studio 2015中自动属性get方法未被代码覆盖的问题
这是个在代码覆盖率分析里挺常见的小问题,我给你几个实用的解决方案,你可以根据自己的场景选择:
1. 简单调用get方法凑覆盖率(快速临时方案)
既然你的Report对象要传给其他API,其实可以在传递前“无意义”地读取一下这些属性,比如:
// 为了满足代码覆盖率,显式读取属性 _ = report.Title; _ = report.Status; _ = report.Type; // 然后再传递给API await otherApi.SendReport(report);
这种方式最直接,虽然看起来没业务逻辑,但能让覆盖率工具识别到get方法被调用过了。记得加个注释说明这是为了覆盖率,避免其他同事疑惑。
2. 配置覆盖率规则忽略自动属性get方法(推荐长期方案)
VS2015支持通过.runsettings文件自定义代码覆盖率的检测规则,我们可以直接排除自动生成的get方法。步骤如下:
- 在你的测试项目里新建一个XML文件,命名为
CodeCoverage.runsettings - 把以下内容粘贴进去:
<RunSettings> <DataCollectionRunSettings> <DataCollectors> <DataCollector friendlyName="Code Coverage" uri="datacollector://Microsoft/CodeCoverage/2.0" assemblyQualifiedName="Microsoft.VisualStudio.Coverage.DynamicCoverageDataCollector, Microsoft.VisualStudio.TraceCollector, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <Configuration> <CodeCoverage> <Sources> <Exclude> <!-- 排除所有自动属性的get方法 --> <Source>.*get_.*</Source> </Exclude> </Sources> </CodeCoverage> </Configuration> </DataCollector> </DataCollectors> </DataCollectionRunSettings> </RunSettings>
- 打开Visual Studio的测试菜单,选择「测试设置」->「选择测试设置文件」,选中刚才创建的
.runsettings文件 - 重新运行单元测试和代码覆盖率分析,get方法的未覆盖提示就会消失了
3. 用特性排除单个属性或整个类的覆盖率检测
如果这个Report类只是个数据传输对象(DTO),确实不需要覆盖这些get方法,可以给它加上[ExcludeFromCodeCoverage]特性:
using System.Diagnostics.CodeAnalysis; [ExcludeFromCodeCoverage] public class Report { public string Title { get; set; } public string Status { get; set; } public string Type { get; set; } }
不过要注意,这个特性会把整个类的所有代码都排除在覆盖率统计之外,如果你需要覆盖set方法的话,就只给单个属性加这个特性就行。
为什么会出现这个问题?
自动实现的属性(比如public string Title { get; set; })在编译时会被编译器转换成带有私有字段的普通属性,生成对应的get_Title和set_Title方法。虽然你只调用了set方法,但代码覆盖率工具会把所有生成的方法都纳入检测范围,所以才会提示get方法未被覆盖。
内容的提问来源于stack exchange,提问作者Ash18
相关产品推荐
相关产品推荐

