iOS自動化探索(十)代碼覆蓋率統計


iOS APP代碼覆蓋率統計

 

今年Q3季度領導給加了個任務要做前后端代碼覆蓋率統計, 鑒於對iOS代碼比較熟就選擇先從iOS端入手,折騰一整天后終於初步把流程跑通了記錄如下

 

覆蓋率監測的原理

Xcode中配置編譯選項后, 編譯后會為每個可執行文件生成對應的 .gcno 文件;之后在代碼中調用覆蓋率分發函數,會生成對應的 .gcda 文件。
  • gcno:包含基本的塊信息,以及代碼行與塊的映射關系;
  • gcda:包含代碼行執行的情況,以及覆蓋率的信息歸納;
執行完測試后,提取goda並借助工具與gcno做對比給出檢測報告

 

必要知識儲備或條件: 

  • 項目源碼
  • 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沙盒文件

 

覆蓋率數據合並

在覆蓋率統計測試中,可能會遇到測試用例需要在不同的設備上運行, 這個時候我們就需要收集每一台手機上的覆蓋率數據然后合並輸出為1份報告

具體操作如下

#1. Xcode配置

同單台手機時操作方法

 

#2. 運行注意事項

同單台手機時操作方法

 

#3. 收集每一台測試手機的覆蓋率日志

同單台手機時操作方法

 

#4. 為每一台手機生成一份覆蓋率測試報告

同單台手機時操作方法, 注意備份台手機的報告文件夾

 

#4. 提取Coverage.info

 上面每台手機的覆蓋率報告中都會有一個Coverage.info

Pods/XcodeCoverage目錄下新建一個文件夾coverage 

然后將上面提取到的.info文件依次命名為Coverage1.info, Coverage2.info ...放入coverage目錄下

 

#5. 新增mergecov腳本

復制一份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

 

#6. 合並生成報告

運行./mergecov即可生成合並的報告, 存放在當前目錄的report文件夾 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM