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

时间:2015-09-01 10:35:01

标签: c# visual-studio-2015 code-coverage mstest c#-6.0

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

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

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

我已在https://github.com/iaingalloway/VisualStudioCodeCoverageIssue

创建了一个有效的MCVE
  • 在Visual Studio 2013 Premium或Ultimate中打开VisualStudio2013.sln
  • 点击测试 - >分析代码覆盖率 - >所有测试。
  • 观察"代码覆盖率结果"窗口报告0块"未涵盖"。
  • 在Visual Studio 2015 Enterprise中打开VisualStudio2015.sln
  • 点击测试 - >分析代码覆盖率 - >所有测试。
  • 观察"代码覆盖率结果"窗口报告1 Block" Not Covered" (ExampleDto.Value的getter)

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

3 个答案:

答案 0 :(得分:8)

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

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

这不是一个很好的解决方法,但只要你没有使用&#34; get _&#34;或&#34;设置_&#34;在名称中,它应该为您提供所需的行为。

答案 1 :(得分: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();
    }
}

答案 2 :(得分:0)

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