首页 文章

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

提问于
浏览
7

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

现在,MSTest的代码覆盖率分析报告单元测试未涵盖某些自动属性 . 在Visual Studio 2013中并非如此,我怀疑它可能与C#6中的新autoproperty功能有关 .

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

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


  • 在Visual Studio 2013 Premium或Ultimate中打开 VisualStudio2013.sln .

  • 单击测试 - >分析代码覆盖率 - >所有测试 .

  • 观察"Code Coverage Results"窗口报告0块"Not Covered" .


  • 在Visual Studio 2015 Enterprise中打开 VisualStudio2015.sln .

  • 单击测试 - >分析代码覆盖率 - >所有测试 .

  • 观察"Code Coverage Results"窗口报告1 Block "Not Covered"(ExampleDto.Value的getter)


Is it possible to configure the built-in Code Coverage tool in Visual Studio 2015 to ignore auto-properties like Visual Studio 2013 does?

3 回答

  • 8

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

    <RunSettings>
      <DataCollectionRunSettings>
        <DataCollector ...>
          <Configuration>
            <CodeCoverage>
              <Functions>
                <Exclude>
                  <Function>.*get_.*</Function>
                  <Function>.*set_.*</Function>
                </Exclude>
              ...
    

    这不是一个很好的解决方法,但只要你没有使用名称中带有“get_”或“set_”的任何函数,它就可以获得你需要的行为 .

  • 1

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

    public class ModelsGetSetTest
    {
    
        [ClassData(typeof(ModelTestDataGenerator))]
        [Theory]
        public void GettersGetWithoutError<T>(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>(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<object[]>
        {
            private readonly List<object[]> _data = new List<object[]>
            {
                new object[] { new UserRole() },
                new object[] { new User() },
                new object[] { new Role() }
            };
    
            public IEnumerator<object[]> GetEnumerator() => _data.GetEnumerator();
            IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
        }
    }
    
  • 0

    我认为 [ExcludeFromCodeCoverage] 是你唯一的选择 . 这只是你要做的一次性事情 . 我个人来说,DO在属性getter / setter上编写单元测试,尤其是在WPF中,我希望确保发生属性更改通知 .

相关问题