Unit testing 如何获得这些代码示例的完整OpenCover分支覆盖率?
我想测试以下两种(不相关的)方法,并使用OpenCover 2.0.802.1实现完整的分支和语句覆盖Unit testing 如何获得这些代码示例的完整OpenCover分支覆盖率?,unit-testing,nunit,code-coverage,opencover,Unit Testing,Nunit,Code Coverage,Opencover,我想测试以下两种(不相关的)方法,并使用OpenCover 2.0.802.1实现完整的分支和语句覆盖 public class Methods { public static void MethodWithDelegate(SynchronizationContext context) { context.Send(delegate { Console.Beep(); }, null); } public static string Metho
public class Methods
{
public static void MethodWithDelegate(SynchronizationContext context)
{
context.Send(delegate { Console.Beep(); }, null);
}
public static string MethodWithSwitchStatement(Type value)
{
string output = string.Empty;
if (value != null)
{
switch (value.ToString())
{
case "System.Int32":
output = "int";
break;
default:
output = "other type";
break;
}
}
return output;
}
}
我编写了以下(NUnit)测试,其中一个使用“Moq”模拟对象:
[Test]
public void Test_ShouldCoverMethodWithDelegate()
{
var context = new Mock<SynchronizationContext>();
Methods.MethodWithDelegate(context.Object);
context.Verify(x => x.Send(It.IsAny<SendOrPostCallback>(), It.IsAny<object>()));
}
[Test]
public void Test_ShouldCoverSwitchStatement()
{
Assert.That(Methods.MethodWithSwitchStatement(null), Is.EqualTo(string.Empty));
Assert.That(Methods.MethodWithSwitchStatement(typeof(int)), Is.EqualTo("int"));
Assert.That(Methods.MethodWithSwitchStatement(typeof(float)), Is.EqualTo("other type"));
}
[测试]
公共无效测试\u应包含委托()的方法
{
var context=newmock();
Methods.MethodWithDelegate(context.Object);
验证(x=>x.Send(It.IsAny(),It.IsAny());
}
[测试]
公共无效性测试\u应包含转换语句()
{
Assert.That(Methods.MethodWithSwitchStatement(null),Is.EqualTo(string.Empty));
Assert.That(Methods.MethodWithSwitchStatement(typeof(int))是.EqualTo(“int”);
Assert.That(Methods.MethodWithSwitchStatement(typeof(float)),是.EqualTo(“其他类型”);
}
但是,在通过OpenCover运行测试之后,coverage.xml
文件始终包含一个分支点,两个测试的访问次数均为零。序列覆盖率为100%
作为一名IL专家,我不确定如何编写进一步的测试以使分支覆盖率达到100%。好的,首先让我们看看IL中的第一种方法(我正在使用) 正如您所看到的,编译器使用switch语句引入了if null测试,但是因为您已经有了这个测试,所以它将永远不会被执行
解决方案:删除初始的if null测试(因为它不是必需的)。好的,首先让我们看看IL中的第一个方法(我正在使用) 正如您所看到的,编译器使用switch语句引入了if null测试,但是因为您已经有了这个测试,所以它将永远不会被执行
解决方案:删除初始的if null测试(因为它不是必需的)。。。。非常感谢你的回答-还有OpenCover,太棒了!不客气-我还写了一篇关于序列覆盖率的文章,您可能会发现这篇有用的好文章,遗憾的是ReportGenerator(还)不完全支持分支覆盖率的显示。只是在浏览coverage.xml文件时,我才发现了上面提到的“问题”。要正确显示是件很困难的事情,有时,就像在第一个示例中一样,在执行TDD时,不需要施加太大的压力(如果这是您的事情)。能够使用IL SPY有助于解释仅仅在C#/VB.NET上应用分支覆盖率是没有帮助的。你认为上述情况不寻常——看看收益率是什么:)。很有趣。。。非常感谢你的回答-还有OpenCover,太棒了!不客气-我还写了一篇关于序列覆盖率的文章,您可能会发现这篇有用的好文章,遗憾的是ReportGenerator(还)不完全支持分支覆盖率的显示。只是在浏览coverage.xml文件时,我才发现了上面提到的“问题”。要正确显示是件很困难的事情,有时,就像在第一个示例中一样,在执行TDD时,不需要施加太大的压力(如果这是您的事情)。能够使用IL SPY有助于解释仅仅在C#/VB.NET上应用分支覆盖率是没有帮助的。你认为上述情况不寻常——看看收益率是什么:)。
.method public hidebysig static
void MethodWithDelegate (
class [mscorlib]System.Threading.SynchronizationContext context
) cil managed
{
// Method begins at RVA 0x2059
// Code size 41 (0x29)
.maxstack 8
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldsfld class [mscorlib]System.Threading.SendOrPostCallback so8254847.Methods::'CS$<>9__CachedAnonymousMethodDelegate1'
IL_0007: brtrue.s IL_001c
IL_0009: ldnull
IL_000a: ldftn void so8254847.Methods::'<MethodWithDelegate>b__0'(object)
IL_0010: newobj instance void [mscorlib]System.Threading.SendOrPostCallback::.ctor(object, native int)
IL_0015: stsfld class [mscorlib]System.Threading.SendOrPostCallback so8254847.Methods::'CS$<>9__CachedAnonymousMethodDelegate1'
IL_001a: br.s IL_001c
IL_001c: ldsfld class [mscorlib]System.Threading.SendOrPostCallback so8254847.Methods::'CS$<>9__CachedAnonymousMethodDelegate1'
IL_0021: ldnull
IL_0022: callvirt instance void [mscorlib]System.Threading.SynchronizationContext::Send(class [mscorlib]System.Threading.SendOrPostCallback, object)
IL_0027: nop
IL_0028: ret
} // end of method Methods::MethodWithDelegate
public static string MethodWithSwitchStatement(Type value)
{
string output = string.Empty;
if (value != null)
{
string a;
if ((a = value.ToString()) != null && a == "System.Int32")
{
output = "int";
}
else
{
output = "other type";
}
}
return output;
}