我刚刚将一堆项目升级到VS2015 / C#6。
现在,MSTest的代码覆盖率分析报告单元测试未涵盖某些自动属性。在Visual Studio 2013中并非如此,我怀疑它可能与C#6中的新autoproperty功能有关。
处理所产生的所有误报都会使代码覆盖率工具的目的失败,因为它几乎不可能识别缺乏测试覆盖率的实际代码。我们不想为所有DTO编写单元测试,而且我真的不需要通过项目使用ExcludeFromCodeCoverage
注释每个自动属性。
我已在https://github.com/iaingalloway/VisualStudioCodeCoverageIssue
创建了一个有效的MCVEVisualStudio2013.sln
。VisualStudio2015.sln
。是否可以在Visual Studio 2015中配置内置代码覆盖率工具以忽略Visual Studio 2013之类的自动属性?
答案 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中,我希望确保发生属性更改通知。