代码覆盖从简到繁(三)

发表于:2011-6-14 13:33

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:周京生(CSDNblog)    来源:51Testing软件测试网采编

  上一篇博客 《代码覆盖从简到繁(二)》介绍了Visual Studio所采用的Block覆盖中Block是如何定义的,并且展示了代码行与Block之间其实并不是严格对应的。本篇博客将通过.NET中间语言(IL)进一步分析Visual Studio是如何划分Block的,从而更准确回答代码行与Block不能严格对应的原因。

  使用Visual Studio获取code coverage数据是非常简单的,只需要在配置中选择“Code Coverage”选项,然后执行测试用例就可以了,覆盖数据会直接在“Code Coverage Results”窗口中呈现出来,这些在《代码覆盖从简到繁(一)》中都有介绍。其实要获取覆盖数据,首先要对被测试的.exe或者.dll进行instrument,所谓instrument实际上就是向文件注入特定的用于收集覆盖数据的代码;然后,启动覆盖数据的监听服务,刚才注入代码会在被指定到时项监听程序发出报告;接下来就是要执行你的测试用例(可以是自动或者手动测试用例);停止监听服务,生成代码覆盖报告。为了易于使用,Visual Studio自动为我们上述很多工作。除了Visual Studio IDE, 通过命令行工具 VsInstr.exe,VsPerfmon和VsPerfCmd来完成获取覆盖数据的操作,Code Coverage Basics with Visual Studio Team System有详细的介绍,这里就不再赘述!这里需要注意:这些命令不只是用于代码覆盖,而是性能Profiling的 工具。

  这里我们用到了VsInstr.exe -coverage命令,用它来instrument我们前面编写的代码,然后通过.NET的Ildasm.exe在IL层观察一下上一篇博客中使用的GetInteger()函数是如何被划分block的,下面就是Instrument之后的GetInteger()函数的IL代码(这里使用的Visual Studio 2010带的C#编译器,编译器不同产生的代码也会不同):

.method public hidebysig instance int32  GetInteger(int32 arg1, int32 arg2) cil managed
{
  // Code size       204 (0xcc)
  .maxstack  3
  .locals init ([0] int32 CS$1$0000, [1] bool CS$4$0001)
  IL_0000:  call       void Microsoft.VisualStudio.Coverage.Init_bbf9568946f2545aaa9b589093700f85::Register()
  IL_0005:  ldsfld     uint64[] Microsoft.VisualStudio.Coverage.Init_bbf9568946f2545aaa9b589093700f85::m_vscov
  IL_000a:  ldc.i4     0x5
  IL_000f:  ldelem.i8
  IL_0010:  ldc.i8     0x1
  IL_0019:  add
  IL_001a:  conv.i
  IL_001b:  ldc.i4.1
  IL_001c:  stind.i1
  IL_001d:  nop                      判断 arg1 > 0
  IL_001e:  ldarg.1   
  IL_001f:   ldc.i4.0   
  IL_0020:  ble.s   IL_0043   如果 arg1 <= 0,跳转到0043处。
  IL_0022:  ldsfld     uint64[] Microsoft.VisualStudio.Coverage.Init_bbf9568946f2545aaa9b589093700f85::m_vscov
  IL_0027:  ldc.i4     0x5
  IL_002c:  ldelem.i8
  IL_002d:  ldc.i8     0x2
  IL_0036:  add
  IL_0037:  conv.i
  IL_0038:  ldc.i4.1
  IL_0039:  stind.i1
  IL_003a:  ldarg.2         判断 arg2 < 0
  IL_003b:  ldc.i4.0
  IL_003c:  clt                 
  IL_003e:  ldc.i4.0
  IL_003f:   ceq               如果 arg2 < 0,  向求值栈(evaluation stack)加载 0;否则为1;
  IL_0041:  br.s  IL_005c      
  IL_0043:  ldsfld     uint64[] Microsoft.VisualStudio.Coverage.Init_bbf9568946f2545aaa9b589093700f85::m_vscov
  IL_0048:  ldc.i4     0x5
  IL_004d:  ldelem.i8
  IL_004e:  ldc.i8     0x3
  IL_0057:  add
  IL_0058:  conv.i
  IL_0059:  ldc.i4.1
  IL_005a:  stind.i1
  IL_005b:  ldc.i4.1       (arg1 <= 0时)向求值栈(evaluation stack)加载 1
  IL_005c:  ldsfld     uint64[] Microsoft.VisualStudio.Coverage.Init_bbf9568946f2545aaa9b589093700f85::m_vscov
  IL_0061:  ldc.i4     0x5
  IL_0066:  ldelem.i8
  IL_0067:  ldc.i8     0x4
  IL_0070:  add
  IL_0071:  conv.i
  IL_0072:  ldc.i4.1
  IL_0073:  stind.i1
  IL_0074:  stloc.1         判断 arg1 > 0 && arg2 < 0 最终结果
  IL_0075:  ldloc.1  
  IL_0076:  brtrue.s   IL_0095
  IL_0078:  ldsfld     uint64[] Microsoft.VisualStudio.Coverage.Init_bbf9568946f2545aaa9b589093700f85::m_vscov
  IL_007d:  ldc.i4     0x5
  IL_0082:  ldelem.i8
  IL_0083:  ldc.i8     0x5
  IL_008c:  add
  IL_008d:  conv.i
  IL_008e:  ldc.i4.1
  IL_008f:  stind.i1
  IL_0090:  nop                  准备return 0
  IL_0091:  ldc.i4.0
  IL_0092:  stloc.0
  IL_0093:  br.s       IL_00b2
  IL_0095:  ldsfld     uint64[] Microsoft.VisualStudio.Coverage.Init_bbf9568946f2545aaa9b589093700f85::m_vscov
  IL_009a:  ldc.i4     0x5
  IL_009f:  ldelem.i8
  IL_00a0:  ldc.i8     0x6
  IL_00a9:  add
  IL_00aa:  conv.i
  IL_00ab:  ldc.i4.1
  IL_00ac:  stind.i1
  IL_00ad:  nop                   准备return 1
  IL_00ae:  ldc.i4.1
  IL_00af:   stloc.0
  IL_00b0:  br.s       IL_00b2
  IL_00b2:  ldsfld     uint64[] Microsoft.VisualStudio.Coverage.Init_bbf9568946f2545aaa9b589093700f85::m_vscov
  IL_00b7:  ldc.i4     0x5
  IL_00bc:  ldelem.i8
  IL_00bd:  ldc.i8     0x7
  IL_00c6:  add
  IL_00c7:  conv.i
  IL_00c8:  ldc.i4.1
  IL_00c9:  stind.i1
  IL_00ca:  ldloc.0
  IL_00cb:  ret 
} // end of method Program::GetInteger

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号