.NET代码覆盖率未按文档统计属性的部分覆盖行数问题
自动属性代码覆盖率显示为两行的原因分析
这不是你对微软文档的理解错误,而是Visual Studio代码覆盖率工具处理自动属性时的显示特性。
核心原因
C#的自动属性(如public string APIVersion { get; set; })在编译时会被编译器拆分为两个独立的IL方法:get_APIVersion和set_APIVersion。虽然在源码中是一行代码,但编译后对应两个完全独立的代码执行块。
Visual Studio的代码覆盖率工具在将IL层面的覆盖数据映射回源码时,会把这两个方法的覆盖状态分别关联到同一源码行,但在UI展示时会拆分为两行——目的是清晰区分该行内部两个逻辑块(getter和setter)的覆盖情况,并非真的把源码行拆成了物理上的两行。
对应你的测试场景
你的单元测试仅调用了setter,因此:
- setter对应的代码块被标记为已覆盖
- getter对应的代码块被标记为未覆盖
工具为了展示这两个不同的状态,就把同一源码行拆成两行显示,但在覆盖率摘要统计中,该行会被归类为「部分覆盖」,这完全符合微软文档中「按行报告」的规则。
结论
这种显示行为是符合文档描述的,只是UI展示的细节容易造成误解。本质是源码一行对应编译后的两个独立方法,工具通过拆分显示来明确每个方法的覆盖状态,而统计层面仍遵循「按行报告」的规则。
内容的提问来源于stack exchange,提问作者luvdav
相关产品推荐
相关产品推荐

