基于lcov-1.11的iOS代碼覆蓋率測試工具:CodeCoverage4iOS

jopen 10年前發布 | 47K 次閱讀 測試工具 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工程配置

  1. 拷貝CodeCoverage4iOS項目到主工程根目錄,即${your_proj.xcworkspace}所在目錄

  2. 在Xcode中設置全局變量 NT_COVERAGE=1,用于代碼覆蓋率開關控制,如配置路徑 iOSProj —> TARGTS -> MyApp -> Build Settings -> Preprocessor Macros -> Debug中添加NT_COVERAGE=1

  3. 對主工程及依賴工程在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打包

  4. 在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}/
  5. 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產生的殘余內容。

收集代碼覆蓋率

  1. APP安裝成功后可以對進行相應的測試操作,完成操作后點擊Home鍵,此時程序會生成.gcda文件到對應目錄。
  2. 生成覆蓋率報告:

    • 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()

  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?件?成覆蓋率報告:

  1. 將Coverage.info文件全部放置到CodeCoverage4iOS/coverage下,如 Coverage1.info、Coverage2.info、Coverage3.info
  2. 執行CodeCoverage4iOS/mergecov 生成合并后的報告

參考文獻

https://developer.apple.com/library/ios/qa/qa1514/_index.html

http://qualitycoding.org/xcode-code-coverage/



項目主頁:http://www.baiduhome.net/lib/view/home/1417661077558

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!