標籤:
基於lcov-1.11的:CodeCoverage4iOS
閱讀目錄
- 環境準備
- Xcode工程配置
- 構建並安裝程式
- 收集程式碼涵蓋範圍
- 過濾結果
- 合并多個Coverage.info?件?成覆蓋率報告:
- 參考文獻
iOS code coverage test tool.
基於lcov-1.11的iOS程式碼涵蓋範圍測試載入器,適用與iOS真機與模擬器。
環境準備
Mac OS X :10.8.5+ 建議10.9
Xcode :5.0+ 建議6.1
回到頂部Xcode工程配置
拷貝CodeCoverage4iOS項目到主工程根目錄,即${your_proj.xcworkspace}所在目錄
在Xcode中設定全域變數 NT_COVERAGE=1,用於程式碼涵蓋範圍開關控制,如配置路徑 iOSProj —> TARGTS -> MyApp -> Build Settings -> Preprocessor Macros -> Debug中添加NT_COVERAGE=1
對主工程及依賴工程在Build Settings做如下配置:
- Generate Debug Symbols 配置成YES
- Generate Test Coverage Files 配置成YES
- Instrument Program Flow 配置成YES
例如:iOSProj —> TARGTS -> MyApp -> Build Settings -> Generate Debug Symbols
以上配置建議僅在Debug下配置為YES,避免影響Release打包
在AppDelegate.m中添加如下代碼:
?
| 12345678910111213141516 |
- (void)applicationDidEnterBackground:(UIApplication *)application{ ... #if NT_COVERAGE #if !TARGET_IPHONE_SIMULATOR NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; setenv("GCOV_PREFIX", [documentsDirectory cStringUsingEncoding:NSUTF8StringEncoding], 1); setenv("GCOV_PREFIX_STRIP", "13", 1); #endif extern void __gcov_flush(void); __gcov_flush(); #endif ...} |
當程式被拉到後台時調用__gcov_flush()產生.gcda檔案,此檔案中記錄了程式碼涵蓋範圍,注意__gcov_flush()可重複調用,記錄為追加寫。
- iOS Simulator : .gcda檔案會產生到預設路徑
~/Library/Developer/Xcode/DerivedData/iOSProj-cndbgdtazzzhaebuyvgjsqmkvwdr/Build/Intermediates/MyApp.build/Debug-iphonesimulator/MyApp.build/Objects-normal/i386·下
- iPhone : .gcda檔案會產生到對應App沙箱
Document/${CURRENT_ARCH}/下
在Build Phases中添加執行指令碼:
在TARGTS -> MyApp -> Build Phases -> New Run Script Phase中編輯Run Script 添加 CodeCoverage4iOS/exportenv.sh
注意 : 要求對主工程及依賴工程都需要做此配置,主要指令碼執行路徑為相對路徑,比如依賴工程與主工程同級目錄,那麼需要將指令碼路徑修改為相對路徑../CodeCoverage4iOS/exportenv.sh
回到頂部構建並安裝程式
完成以上配置可以對Xcode工程進行構建,在使用Xcode安裝app前確保CodeCoverage4iOS目錄下envs.sh檔案已刪除
注意 : 如果只執?BuildCommand+B也會產?envs.sh檔案,建議Build成功後檢查刪除envs.sh?件,再執?Command+R,確保envs.sh沒有上次build產生的殘餘內容。
回到頂部收集程式碼涵蓋範圍
- APP安裝成功後可以對進行相應的測試操作,完成操作後點擊Home鍵,此時程式會產生.gcda檔案到對應目錄。
產生覆蓋率報告:
- iOS Simulator : 如果測試裝置為iOS類比機可直接雙擊執行
CodeCoverage4iOS/getcov
- iPhone : 如果測試裝置為iPhone真機,首先需要從沙箱
Document/${CURRENT_ARCH}下拷貝.gcda檔案到CodeCoverage4iOS/gcda下,再執行CodeCoverage4iOS/getcov
執行CodeCoverage4iOS/getcov過程中會在目錄CodeCoverage4iOS/coverage下產生coverage.info檔案,根據coverage.info檔案產生最終報告。PS:如果需要合并測試結果,需要保留此檔案
測試報告產生路徑:CodeCoverage4iOS/report/index.html
回到頂部過濾結果
如果需要對收集的覆蓋率結果進行過濾,可以編輯CodeCoverage4iOS/getcov中的函數exclude_data()
?
| 123456 |
exclude_data(){ LCOV --remove $COVERAGE_INFO_DIR/${LCOV_INFO} "Developer/SDKs/*" -d "${OBJ_DIR}" -o $COVERAGE_INFO_DIR/${LCOV_INFO} LCOV --remove $COVERAGE_INFO_DIR/${LCOV_INFO} "main.m" -d "${OBJ_DIR}" -o $COVERAGE_INFO_DIR/${LCOV_INFO} # Remove other patterns here...} |
回到頂部合并多個Coverage.info?件?成覆蓋率報告:
- 將Coverage.info檔案全部放置到
CodeCoverage4iOS/coverage下,如 Coverage1.info、Coverage2.info、Coverage3.info
- 執行
CodeCoverage4iOS/mergecov 產生合并後的報告
回到頂部參考文獻
https://developer.apple.com/library/ios/qa/qa1514/_index.html
http://qualitycoding.org/xcode-code-coverage/
項目首頁:http://www.open-open.com/lib/view/home/1417661077558
iOS程式碼涵蓋範圍測試載入器