实际上这也正是visual studio在后台为我们悄悄做的工作,当然啦,Visual Studio不会直接在原来项目编译出来的文件作更改,它会将文件(wildchar.exe)拷贝一份,然后再拷贝上进行更改,更改后的程序文件会存放在 解决方案文件夹的Test Result文件夹里以测试结果命名的文件夹中,例如我的修改过的可执行文件存放在:
E:\临时文档\WildChar\TestResults\施懿民_SHIYIMIN 2009-12-19 01_02_22\Out\
使用ILDASM.exe(或者reflector.exe)你就可以看出来,例如下面就是修改过后的IL 代码:
.method private hidebysig static void ReverseStringPairImp(string input, int32 inputIter, char[] result, int32 resultIter) cil managed { // Code size 1333 (0x535) .maxstack 5 .locals init ([0] int32[] indics, [1] int32 i, [2] bool CS$4$0000, [3] int32[] CS$0$0001) IL_0000: call void Microsoft.VisualStudio.Coverage.Init_c292aced4dea6d28292bbb91547781d7::Register() // 下面就是 Visual Studio自动为我们添加的跟踪代码覆盖率的代码: IL_0005: ldsfld uint32[] Microsoft.VisualStudio.Coverage.Init_c292aced4dea6d28292bbb91547781d7::m_vscov IL_000a: ldc.i4 0xa IL_000f: ldelem.u4 IL_0010: ldc.i4 0xa IL_0015: add IL_0016: ldc.i4.1 IL_0017: stind.i1 IL_0018: nop IL_0019: br.s IL_0033 IL_001b: ldsfld uint32[] Microsoft.VisualStudio.Coverage.Init_c292aced4dea6d28292bbb91547781d7::m_vscov IL_0020: ldc.i4 0xa IL_0025: ldelem.u4 IL_0026: ldc.i4 0xb IL_002b: add IL_002c: ldc.i4.1 ... } // end of method Program::ReverseStringPairImp |
使用代码覆盖率的注意事项
1. 代码覆盖率只能告诉你产品代码还有哪些地方、哪些功能模块没有测试到,或者说很仔细地测试过。不能告诉你比如测试效果是否已经足够好了,比如说代码覆盖率为100%不能说明你已经把用户的需求都考虑并且测试到了。请考虑下面的代码:
Int a = b * c; Console.WriteLine(a); |
如果b 和c的值很小的话,那么 后面的Console那句就会执行,如果我们先执行这个测试用例,那么Console那句就会被标注为已经覆盖过,而且是100%覆盖过。但是并不没有测试到b和c很大造成整数溢出异常这种情形。
2. 另外,代码覆盖率并不是自动化测试才能检查的,如果你的自动化测试用例不够,你完全可以把Visual Studio修改过的程序拷贝出来,手工执行一些测试用例。不管是自动化还是手工的测试用例,只要能够执行为覆盖的产品代码,最后 Visual Studio在统计结果的时候,都会统计进去(当然,手工用例的执行,应该在 Visual studio统计结果之前执行—通常就是一次Test Run执行完毕之前)。
原文转自:http://www.uml.org.cn/Test/201306262.asp