最近接觸的項目涉及到C#開發的應用,測試過程當中咱們須要去分析C#的代碼覆蓋率,問了一些人,在網上也搜了一些,零碎的找到不少資料,可是都不是很完整,實際使用的過程當中仍是走了很多彎路。到如今爲止,有兩種可行的方案試驗成功了,這裏寫出來給你們分享下。可能不少人都用過,就當是個整理吧。
方法一:使用VS自帶的vsinstr工具
準備條件:安裝VS2010或者VS2012。
基本的操做步驟,主要是三個。
1. 對被測的DLL進行插樁。
"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Performance Tools\x64\vsinstr" -coverage "D:\xxx.dll"
原來的dll自動被改名爲 *.orig,至關因而一個備份。能夠看到被插樁的DLL尺寸有所增長。
2. 啓動coverage數據監控和收集。
start vsperfmon -coverage -output:"D:\xyz.coverage" /CS /user:everyone
3. 運行被測的程序,或者等待被執行。
4. 停掉被執行的程序,能夠直接關閉應用。
5. 中止coverage監聽,生成數據。
vsperfcmd /shutdown
6. 找到D:\xyz.coverage,雙擊能夠直接用VS打開查看。 顯示的是block覆蓋率,若是有source code能夠對着代碼查看。
方法一小結:
1. 這種方式除了最後查看報告,不須要啓動VS,也不限制被測的代碼如何被測試,能夠手工也能夠其餘自動化程序。
2. 目前來看須要逐個DLL插樁,對於exe文件沒有嘗試。
3. 生成的覆蓋率報告是二進制文件,須要在VS裏面查看。
4. 目前看到的是隻有block級別的覆蓋率數據,沒有找到line級別的。
方法二:使用免費的OpenCover工具
準備條件:
1. 安裝OpenCover工具,能夠直接下載msi或者zip包
2. 下載ReportGenerator工具,用於將OpenCover生成的XML報告轉換成更加可讀的HTML報告。
具體的步驟:
1. 在VS裏面隨便用C#寫了一小段代碼,包含了一個分支,用於查看覆蓋和未覆蓋的狀況。編譯成 ConsoleApplicaiton1.exe
2. 經過OpenCover將被測的ConsoleApplicaiton1.exe在命令行啓動起來,加上相關的參數。
-output:c2.xml 指明將生成的報告文件名。
-targetdir: 告訴OpenCover這個exe對應的PDB在哪兒。兩種方法PDB文件都是必須的。
-register 不是很清楚用途,可是是必須的,第一次沒加這個參數覆蓋率數據出不來。
更詳細的參數請查看OpenCover的手冊。
具體的命令:
OpenCover.Console.exe -register -target:"C:\Users\rickyqiu\Documents\Visual Studio 2012\Projects\ConsoleApplication1\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe" -output:c2.xml -targetdir:"C:\Users\rickyqiu\Documents\Visual Studio 2012\Projects\ConsoleApplication1\ConsoleApplication1\bin\Debug"
執行的結果以下面的cmd窗口。程序很簡單,因此很快跑完了,顯示了一個覆蓋率的摘要。
這樣就能夠獲得指定的報告文件 c2.xml了。
3. 能夠用ReportGenerator工具生成HTML的報告便於查看。
因爲這裏有源碼,因此HTML報告裏面就直接顯示了代碼行級別的覆蓋率。紅色的部分是沒有執行到的,綠色的是被執行到的。加起來是可覆蓋(coverable)行。這裏的概念都是比較通用的,和其餘語言的覆蓋率也是同樣的。
方法二小結:
1. 這個方法沒有顯示的插樁(instrument)的動做,個人理解是在將被測程序啓動的時候作了一些事情。試過多個文件包含exe和dll都是能夠的。
下面是一個外面找到的實際的大一點的子項目代碼的例子。
2. 能夠直接看到line級別的覆蓋率數據,有源碼的話能夠直接映射到源碼,無源碼是到文件級別的彙總數據。
3. 整個使用過程仍是很是方便的,不管是上面的demo console小程序,仍是這個有GUI的比較大的實際client。被啓動後能夠像單獨運行時同樣使用,無任何感知,因此對測試手段也沒有要求,手工或者本身的自動化程序均可以。
4. 報告比較方便,特別是用ReportGenerator後。
還有一些待研究的:
1. 若是團隊有多人一塊兒執行測試,如何合併多人的覆蓋率數據。
2. 若是是對於server端的程序,如何來處理。應該是能夠作到,可是須要去驗證。
總的來講,不管那種方法提供的數據,對於咱們的測試都有很好的參考價值,是一個重要的輔助手段。
http://blog.csdn.net/superqa/article/details/9060521