實際上這也正是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