今年Q3季度領導給加了個任務要作先後端代碼覆蓋率統計, 鑑於對iOS代碼比較熟就選擇先從iOS端入手,折騰一成天后終於初步把流程跑通了記錄以下html
以上說的幾個都不懂也行, 讓開發幫忙作這些而後編個代碼覆蓋率統計的包給你測試, 測完把手機給開發取數據生成報告。 注意每次測試完先按下HOME鍵把程序退到後臺等幾秒讓app本身生成日誌文件git
下面開始講步驟後端
git clone XXXXXXXXXXX
打開終端, cd到項目路徑編輯Podfileapp
vi Podfile
添加:函數
pod 'XcodeCoverage', ‘~>1.0'
運行pod update安裝依賴庫工具
pod update
1. 使用Xcode打開項目,Targes -> 選擇你的APP -> Build Settings -> 搜索Preprocessor Macros -> 展開在Debug一欄加入NT_COVERAGE=1測試
注意這裏咱們都只修改Debug模式下的屬性, 避免影響線上版本的打包發佈ui
2. 一樣在Build Settings中將如下3項的Debug模式改成Yesspa
3. Build Phase中 -> New Run Script Phase -> Run Scrip中添加Pods/XcodeCoverage/exportenv.sh3d
這裏有個注意的地方, 若是本來項目中已經有一個run script也仍是新建一個
#4. AppDelegate.m中applicationDidEnterBackground方法添加如下代碼
#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
選擇Debug模式安裝到手機或者模擬器上
注意每次完成測試後先按Home鍵退到後臺, 等幾秒讓APP產生覆蓋率日誌不要直接殺掉APP進程
若是是在模擬器上運行測試能夠跳過此步
1. 打開Xcode -> window -> Devices and Simulaters, 選擇運行測試的真機
2. 在Installed Apps中選擇測試的應用,而後點擊底部的齒輪按鈕選擇Download Container
3. 會獲得一個xxxx.xcappdata文件
4. 右鍵點擊xcappdata文件 -> 顯示包內容, 進入AppData/Documents/arm64/, 拷貝里面的全部.gcda文件
5. 進入項目目錄/Pods/XcodeCoverage, 打開env.sh, 找到 OBJECT_FILE_DIR_normal屬性和CURRENT_ARCH屬性的值, 這裏要注意下若是CURRENT_ARCH的值是undefined就改爲arm64(關鍵)
6. 打開Finder,使用shift+command+G按鈕輸入<OBJECT_FILE_DIR_normal>/<CURRENT_ARCH>
,其中 OBJECT_FILE_DIR_normal
及 CURRENT_ARCH
是上一步找到的值,(尖括號注意去掉)
7. 把上面第4步拷貝的全部.gcda文件拷貝到第六步打開的目錄中
打開終端, cd進入項目目錄/Pods/XcodeCoverage, 運行命令:
./getcov --show
便可自動生成覆蓋率報告
整個過程手動操做較多, 能夠繼續研究下若是實現自動化
其中步驟6可使用ifuse掛在沙盒來實現自動化提取.gcda文件, 方法能夠參考下面這篇
在覆蓋率統計測試中,可能會遇到測試用例須要在不一樣的設備上運行, 這個時候咱們就須要收集每一臺手機上的覆蓋率數據而後合併輸出爲1份報告
具體操做以下
同單臺手機時操做方法
同單臺手機時操做方法
同單臺手機時操做方法
同單臺手機時操做方法, 注意備份臺手機的報告文件夾
上面每臺手機的覆蓋率報告中都會有一個Coverage.info
Pods/XcodeCoverage目錄下新建一個文件夾coverage
而後將上面提取到的.info文件依次命名爲Coverage1.info, Coverage2.info ...放入coverage目錄下
複製一份Pods/XcodeCoverage目錄下的getcov文件, 重命名爲爲mergecov
而後修改內容爲:
#!/bin/sh DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" source ${DIR}/envcov.sh ALL_COVERAGE=CoverageAll.info INFO_DIR=${DIR}/coverage MERGE_CMD_P1='' REPORT_DIR=${DIR}/report if [ -e $INFO_DIR/$ALL_COVERAGE ]; then rm -r $INFO_DIR/$ALL_COVERAGE fi if [ -e $REPORT_DIR ]; then rm -r $REPORT_DIR fi mkdir $REPORT_DIR for file in ` ls $INFO_DIR` do MERGE_CMD_P1="$MERGE_CMD_P1 -a $INFO_DIR/$file" done LCOV $MERGE_CMD_P1 -o $INFO_DIR/$ALL_COVERAGE "${LCOV_PATH}/genhtml" --output-directory ${REPORT_DIR} $INFO_DIR/$ALL_COVERAGE cd ${REPORT_DIR} echo "open index.html====================" open index.html
運行./mergecov便可生成合並的報告, 存放在當前目錄的report文件夾
原文出處:https://www.cnblogs.com/zhouxihi/p/11175244.html