收集iOS程序的代碼覆蓋率

前面講到<收集Android程序的代碼覆蓋率 >的時候,講到收集代碼覆蓋率分別有修改最終程序(例如Emma是修改字節碼),和修改源文件兩種方式。而在iOS上,採用的就是後者,iOS原來用的是gcov收集代碼覆蓋率,後面蘋果的LLVM項目,也實現了代碼覆蓋率收集功能,用法完全兼容gcov,而且生成的代碼覆蓋率統計文件的格式也兼容gcov。

先說說怎樣收集ios程序的代碼覆蓋率,然後再說說原理性的東西。

不知道大家用的是xcode的哪個版本?老版本的xcode使用的clang編譯器的代碼覆蓋率功能好像壞掉了……也就是說按照蘋果的文檔去做,生成的程序在啓動的時候會崩潰。在最新的clang編譯器裏,已經修復了這個缺陷,下面是做法:

1.    首先下載LLVM的最新源碼(LLVM是一個開源項目 ,需要SVN客戶端,在終端中運行):
svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
2.    在同步clang的源代碼:
cd llvm/tools
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
3.    代碼同步完畢後,編譯編譯器:
cd..
# 指定將我們編譯的clang安裝到opt文件夾中
./configure --prefix=/opt --enable-optimized
# 是用8個線程並行編譯
make -j8
# 將結果程序安裝到/opt文件夾中
sudo make install

編譯好了以後,需要告訴xcode使用最新的編譯器,而不是它自帶的壞掉的編譯器。在Xcode裏打開工程:
1.    設置User Defined Build Setting:CC = /opt/bin/clang,這一步告訴xcode使用我們的編譯器,如果大家熟悉make的話,應該知道CC是一個很出名的make變量。如下圖所示:
 xcode_cov_cc

2.    設置Other C Flags: --coverage,這一步告訴clang在編譯時,生成代碼覆蓋率版本。如下圖所示:
xcode_cov_cflags
3.    設置Other Linker Flags: --coverage -lprofile_rt,這一步告訴clang在鏈接時,需要連接收集代碼覆蓋率用到的函數庫。 如下圖所示:
 xcode_cov_linkflags

設置好以後,編譯,然後在模擬器裏或者手機裏執行手工或自動化測試,測試完畢後,代碼覆蓋率信息就已經保存好了,看的話,需要一個工具CoverStory,CoverStory是用來看gcov生成的代碼覆蓋率信息的,但因爲clang完全兼容gcov,所以也就可以複用這個工具,下載地址是:http://code.google.com/p/coverstory/

而代碼覆蓋率信息是放在一個非常隱晦的地方(說實話那個地方我很久以來只會通過終端進入,一直都沒找到從GUI界面進去的方式):
# ~代表用戶的家 (Home)目錄,由於我用的是模擬器,因此下面的路徑裏用的是Debug-iphonesimulator,如果是用真機 # 機 ,應該是Debug-iphoneos文件夾。 ~/Library/Developer/Xcode/DerivedData/<你的ios工程名加上一堆隨機字符>/Build/Intermediates/<工程名.build>/Debug-iphonesimulator/<工程名.build>/Object-normal/<cpu 架構>/ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }

以我得機器爲例,我的工程如上圖所示是CoreDataBooks,因此路徑是:
shiyimin-Mac-2:i386 shiyimin$ pwd
/Users/mahmood1/Library/Developer/Xcode/DerivedData/CoreDataBooks-dpmulgzuyflwiycpkobgmstmioxz/Build/Intermediates/CoreDataBooks.build/Debug-iphonesimulator/CoreDataBooks.build/Objects-normal/i386

在Finder裏將這個目錄拖到CoverStory裏,就可以看到具體的代碼覆蓋率信息了:

cover_story
 
從上圖可以看到,最左邊的列表裏,顯示了ios程序各源代碼的代碼覆蓋率比例,例如CoreDataBooksAppDelegate.m這個文件的覆蓋率就只有52.9%,右邊紅色高亮顯示了在測試中未覆蓋到的代碼,而已覆蓋的代碼以黑色顯示。

如果你把文件夾拖到CoverStory裏,沒有任何反應,可以在查看文件夾裏是否有.gcda和.gcno文件來排錯,如果沒有這兩種文件,那一般說明沒有收集到代碼覆蓋率信息。
xcode_cov_troubleshooting

最後,有關gcov的使用和原理,請參看gcov文檔:http://gcc.gnu.org/onlinedocs/gcc/Gcov.html

本文由知平軟件施懿民編寫,請關注我們的微博

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章