收集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 架構>/

以我得機器為例,我的工程如上圖所示是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 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM