从Visual Studio 2015中的代码覆盖率中排除自动属性

我刚刚将一堆项目升级到VS2015 / C#6。

现在,MSTest的代码覆盖率分析报告unit testing未涵盖某些自动属性。 在Visual Studio 2013中并非如此,我怀疑它可能与C#6中的新autopropertyfunction有关。

处理所产生的所有误报都会使代码覆盖率工具的目的失败,因为它几乎不可能识别缺乏测试覆盖率的实际代码。 我们不想为所有DTO编写unit testing,而且我真的不需要通过ExcludeFromCodeCoverage为项目注释每个单独的自动属性。

我在https://github.com/iaingalloway/VisualStudioCodeCoverageIssue创建了一个有效的MCVE


  • 在Visual Studio 2013 Premium或Ultimate中打开VisualStudio2013.sln
  • 单击测试 – >分析代码覆盖 – >所有测试。
  • 观察“代码覆盖率结果”窗口报告0块“未涵盖”。

  • 在Visual Studio 2015 Enterprise中打开VisualStudio2015.sln
  • 单击测试 – >分析代码覆盖 – >所有测试。
  • 观察“代码覆盖率结果”窗口报告1块“未覆盖”(ExampleDto.Value的getter)

是否可以在Visual Studio 2015中配置内置代码覆盖率工具以忽略Visual Studio 2013之类的自动属性?

作为解决方法,您可以将以下内容添加到.runsettings文件中: –

        .*get_.* .*set_.*  ... 

这不是一个很好的解决方法,但只要你没有在名称中使用任何带有“get_”或“set_”的函数,它就能为你提供所需的行为。

我不喜欢过滤所有get / set方法,特别是因为我有时会编写需要测试的get和set逻辑。 对我来说,对于相对简单模型的基本覆盖,下面的一对xUnit测试运行良好:

 public class ModelsGetSetTest { [ClassData(typeof(ModelTestDataGenerator))] [Theory] public void GettersGetWithoutError(T model) where T: BaseEntity { PropertyInfo[] properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); for (var i = 0; i < properties.Length; i++) { var prop = properties[i]; prop.GetValue(model); } } [ClassData(typeof(ModelTestDataGenerator))] [Theory] public void SettersSetWithoutError(T model) where T : BaseEntity { PropertyInfo[] properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); for (var i = 0; i < properties.Length; i++) { var prop = properties[i]; prop.SetValue(model, null); } } public class ModelTestDataGenerator : IEnumerable { private readonly List _data = new List { new object[] { new UserRole() }, new object[] { new User() }, new object[] { new Role() } }; public IEnumerator GetEnumerator() => _data.GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); } } 

我认为[ExcludeFromCodeCoverage]是您唯一的选择。 这只是你要做的一次性事情。 我个人而言,DO在属性getter / setter上编写unit testing,特别是在WPF中,我希望确保发生属性更改通知。