最近接觸的項目涉及到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"