欢迎来到天天文库
浏览记录
ID:36311419
大小:43.50 KB
页数:5页
时间:2019-05-09
《代码覆盖从简到繁 (三) 划分block》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、代码覆盖从简到繁(三)划分Block 上一篇博客《代码覆盖从简到繁(二)–BlockCoverage》介绍了VisualStudio所采用的Block覆盖中Block是如何定义的,并且展示了代码行与Block之间其实并不是严格对应的。本篇博客将通过.NET中间语言(IL)进一步分析VisualStudio是如何划分Block的,从而更准确回答代码行与Block不能严格对应的原因。使用VisualStudio获取codecoverage数据是非常简单的,只需要在配置中选择“CodeCoverage”选项,然后直接执行测试用例就可以了就可以了,测
2、试执行完毕后,覆盖数据会直接显现在"CodeCoverageResults”窗口中呈现出来,这些在《代码覆盖从简到繁(一)》中都有介绍。其实要获取覆盖数据,首先要对被测试的.exe或者.dll进行instrument,所谓instrument实际上就是向文件注入特定的用于收集覆盖数据的代码;然后,启动覆盖数据的监听服务,刚才注入代码会在被指定到时项监听程序发出报告;接下来就是要执行你的测试用例(可以是自动或者手动测试用例);停止监听服务,生成代码覆盖报告。为了易于使用,VisualStudio自动为我们上述很多工作。除了VisualStudio
3、IDE,通过命令行工具VsInstr.exe,VsPerfmon和VsPerfCmd来完成获取覆盖数据的操作,CodeCoverageBasicswithVisualStudioTeamSystem有详细的介绍,这里就不再赘述!这里需要注意:这些命令不只是用于代码覆盖,而是性能Profiling的工具。 这里我们用到了VsInstr.exe-coverage命令,用它来instrument我们前面编写的代码,然后通过.NET的Ildasm.exe在IL层观察一下上一篇博客中使用的GetInteger()函数是如何被划分block的,下面就是I
4、nstrument之后的GetInteger()函数的IL代码(这里使用的VisualStudio2010带的C#编译器,编译器不同产生的代码也会不同):.methodpublichidebysiginstanceint32GetInteger(int32arg1,int32arg2)cilmanaged{//Codesize204(0xcc).maxstack3.localsinit([0]int32CS$1$0000,[1]boolCS$4$0001)IL_0000:callvoidMicrosoft.VisualStudio.Covera
5、ge.Init_bbf9568946f2545aaa9b589093700f85::Register()IL_0005:ldsflduint64[]Microsoft.VisualStudio.Coverage.Init_bbf9568946f2545aaa9b589093700f85::m_vscovIL_000a:ldc.i40x5IL_000f:ldelem.i8IL_0010:ldc.i80x1IL_0019:addIL_001a:conv.iIL_001b:ldc.i4.1IL_001c:stind.i1IL_001d:nop判断ar
6、g1>0IL_001e:ldarg.1IL_001f:ldc.i4.0IL_0020:ble.sIL_0043如果arg1<=0,跳转到0043处。IL_0022:ldsflduint64[]Microsoft.VisualStudio.Coverage.Init_bbf9568946f2545aaa9b589093700f85::m_vscovIL_0027:ldc.i40x5IL_002c:ldelem.i8IL_002d:ldc.i80x2IL_0036:addIL_0037:conv.iIL_0038:ldc.i4.1IL_0039:s
7、tind.i1IL_003a:ldarg.2判断arg2<0IL_003b:ldc.i4.0IL_003c:cltIL_003e:ldc.i4.0IL_003f:ceq如果arg2<0,向求值栈(evaluationstack)加载0;否则为1;IL_0041:br.sIL_005cIL_0043:ldsflduint64[]Microsoft.VisualStudio.Coverage.Init_bbf9568946f2545aaa9b589093700f85::m_vscovIL_0048:ldc.i40x5IL_004d:ldelem.i
8、8IL_004e:ldc.i80x3IL_0057:addIL_0058:conv.iIL_0059:ldc.i4.1IL_005a:stind.i1
此文档下载收益归作者所有