基于lcov-1.11的iOS代碼覆蓋率測試工具:CodeCoverage4iOS
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中添加如下代碼:
- (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}/
下
- iOS Simulator : .gcda文件會生成到默認路徑
-
在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
- iOS Simulator : 如果測試設備為iOS模擬機可直接雙擊執行
過濾結果
如果需要對收集的覆蓋率結果進行過濾,可以編輯CodeCoverage4iOS/getcov
中的函數exclude_data()
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/