iOS自動化探索(十)程式碼覆蓋率統計
iOS APP程式碼覆蓋率統計
今年Q3季度領導給加了個任務要做前後端程式碼覆蓋率統計, 鑑於對iOS程式碼程式碼比較熟就選擇先從iOS端入手,折騰一整天后終於初步把流程跑通了記錄如下
覆蓋率監測的原理
Xcode中配置編譯選項後, 編譯後會為每個可執行檔案生成對應的 .gcno 檔案;之後在程式碼中呼叫覆蓋率分發函式,會生成對應的 .gcda 檔案。- gcno:包含基本的塊資訊,以及程式碼行與塊的對映關係;
- gcda:包含程式碼行執行的情況,以及覆蓋率的資訊歸納;
必要知識儲備或條件:
- 專案原始碼
- Xcode開發環境,包括開發者賬號
- Cocopods基礎用法
- Xcode真機執行基礎操作
- 抓取APP沙盒日誌基礎操作
- Git基礎操作
以上說的幾個都不懂也行, 讓開發幫忙做這些然後編個程式碼覆蓋率統計的包給你測試, 測完把手機給開發取資料生成報告。 注意每次測試完先按下HOME鍵把程式退到後臺等幾秒讓app自己生成日誌檔案
下面開始講步驟
步驟1: 拉取專案程式碼
git clone XXXXXXXXXXX
步驟2: 編輯Podfile檔案, 新增XcodeCoverage庫
開啟終端, cd到專案路徑編輯Podfile
vi Podfile
新增:
pod 'XcodeCoverage', ‘~>1.0'
執行pod update安裝依賴庫
pod update
步驟3:Xcode工程配置
1. 使用Xcode開啟專案,Targes -> 選擇你的APP -> Build Settings -> 搜尋Preprocessor Macros -> 展開在Debug一欄加入NT_COVERAGE=1
注意這裡我們都只修改Debug模式下的屬性, 避免影響線上版本的打包釋出
2. 同樣在Build Settings中將以下3項的Debug模式改為Yes
- Generate Debug Symbols 配置成YES
- Generate Legacy Test Coverage Files 配置成YES
- Instrument Program Flow 配置成YES
3. Build Phase中 -> New Run Script Phase -> Run Scrip中新增Pods/XcodeCoverage/exportenv.sh
這裡有個注意的地方, 如果原本專案中已經有一個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
步驟4: 編譯安裝
選擇Debug模式安裝到手機或者模擬器上
步驟5:手動測試或者執行自動化測試
注意每次完成測試後先按Home鍵退到後臺, 等幾秒讓APP產生覆蓋率日誌不要直接殺掉APP程序
步驟6:提取真機上的.gcda檔案
如果是在模擬器上執行測試可以跳過此步
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檔案拷貝到第六步開啟的目錄中
步驟7:生成覆蓋率報告
開啟終端, cd進入專案目錄/Pods/XcodeCoverage, 執行命令:
./getcov --show
即可自動生成覆蓋率報告
整個過程手動操作較多, 可以繼續研究下如果實現自動化
其中步驟6可以使用ifuse掛在沙盒來實現自動化提取.gcda檔案, 方法可以參考下面這篇
使用libimobiledevice + ifuse提取iOS沙盒檔案
&n