2.6.1 簡介
? ? ?在采集了覆蓋率數據后,就需要生成對應需求的全量和增量覆蓋率報告,以便對測試進行查漏補缺。IOS系統有兩種開發語言,所以生成報告的方式也不相同,下面就分別介紹一下Object C和Swift語言如何生成覆蓋率報告。
2.6.2 Object C項目生成全量報告
提取覆蓋率數據
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 是上一步找到的值,(尖括號注意去掉)
7. 把上面第4步拷貝的所有.gcda文件拷貝到第六步打開的目錄中
8,生成覆蓋率報告
打開終端, cd進入項目目錄/Pods/XcodeCoverage, 運行命令:
./getcov --show
即可自動生成覆蓋率報告
測試報告文件在路徑:/Users/*****/Xcode/DerivedData/GHDropMenuDemo-fyxjnfwoowzqbhefbawkfehlqwlt/Build/Products/Debug-iphoneos/lcov下
這個報告就是針對整個項目的全量報告,生成過程手動操作較多, 可以繼續研究下如果實現自動化。
2.6.3 Object C項目生成增量報告
由于iOS沒有生成增量報告的工具,我們經過調研與嘗試,可以通過以下方案進行處理:
1,通過lcov命令生成info報告數據
lcov -b <測試代碼路徑> -d <gcda目錄位置> -c -o result.info --rc lcov_branch_coverage=1
注意:測試代碼路徑中包含構建生成的類文件 gcno。
2,生成的info格式的報告文件就可以解讀,通過git diff拿到增量信息,然后再處理報告,處理方法和Swift是一樣的,后面我們統一介紹。
3,處理后的數據為diffreport.info文件,通過genhtml生成報告即可:
genhtml -o diffreport diffreport.info
2.6.4 Swift項目生成全量報告
1,收集生成覆蓋率數據文件
(1)拷貝第二步生成的覆蓋率數據文件,如:test.profraw;
(2)拷貝應用構建生成的可執行文件
路徑:
~/Library/Developer/Xcode/DerivedData/shoppingCart-efmklxddypsuvfgiumzoyfnmnudr/Build/Products/Debug-iphoneos/shoppingCart.app/shoppingcart
當然也可以解壓ipa文件或是app文件拿到可執行文件。
2,生成覆蓋率報告
(1)合并及轉換覆蓋率數據
?
xcrun llvm-profdata merge coverage_file1657885040728.profraw coverage_file1657885829980.profraw test.profraw -output merged.profrawxcrun llvm-profdata merge -sparse test.profraw -o test.profdata
(2)查看覆蓋情況命令
xcrun llvm-cov show ./shoppingCart --instr-profile=test.profdata
(3)生成匯總報告
xcrun llvm-cov report ./shoppingCart -instr-profile=test.profdata
(4)生成HTML報告
xcrun llvm-cov show ./shoppingCart
--instr-profile=test.profdata --format=html
-use-color --output-dir ./coverage_report
(5) 生成XcodeCoverage報告
A, 生成info文件
xcrun llvm-cov export ./shoppingCart
--instr-profile=test.profdata -use-color
--format=lcov > ./newreport.info
B, 生成xcodecoverage報告
./lcov-1.14/bin/genhtml -o html ./newreport.info
C, 報告樣式如下:
2.6.5 Swift項目生成增量報告
在網絡上查了一下iOS增量報告的生成,幾乎沒有現成的方案,通過分析allreport.info文件,發現這個文件的信息如下所示:
一個Swift 項目的覆蓋率報告Info文件,具體的內容如下:
SF:/Users/sxf/Documents/精準測試/KimCode/iOSSDKInject/kim-ios/packages/kim-ios/Kim/DataHelper/KImPinYin.swift
FN:16,$s4Kima9KimPinYinC7preloadyyFZ
FN:20,$s4Kima9KimPinYinCACycfc
FN:24,$s4Kima9KimPinYinCfD
FN:28,$s4Kima9KimPinYinC12pinyinLoadedyyF
FN:33,$s4Kima9KimPinYinC7convertyS2SF
FN:42,$sSa4Kima8KimModel0B12SelectMemberCRszlE23sortByDisplayNamePinyinSayADGyF
FN:49,$sSa4Kima8KimModel0B12SelectMemberCRszlE23sortByDisplayNamePinyinSayADGyFSbSS_Sit_SS_SittXEfU_
FN:52,$sSa4Kima8KimModel0B12SelectMemberCRszlE23sortByDisplayNamePinyinSayADGyFADSgSS_SitXEfU0_
FN:60,$sSa4Kima8KimModel0B4UserVRszlE23sortByDisplayNamePinyinSayADGyF
FN:67,$sSa4Kima8KimModel0B4UserVRszlE23sortByDisplayNamePinyinSayADGyFSbSS_Sit_SS_SittXEfU_
FN:70,$sSa4Kima8KimModel0B4UserVRszlE23sortByDisplayNamePinyinSayADGyFADSgSS_SitXEfU0_
FN:78,$sSa4Kima8KimModel0b18GroupMemberContactC0CRszlE23sortByDisplayNamePinyin15moveAdminToFistSayADGSb_tF
FN:85,$sSa4Kima8KimModel0b18GroupMemberContactC0CRszlE23sortByDisplayNamePinyin15moveAdminToFistSayADGSb_tFSbSS_Sit_SS_SittXEfU_
FN:88,$sSa4Kima8KimModel0b18GroupMemberContactC0CRszlE23sortByDisplayNamePinyin15moveAdminToFistSayADGSb_tFADSgSS_SitXEfU0_
FNDA:2,$s4Kima9KimPinYinC7preloadyyFZ
FNDA:0,$s4Kima9KimPinYinCACycfc
FNDA:0,$s4Kima9KimPinYinCfD
FNDA:0,$s4Kima9KimPinYinC12pinyinLoadedyyF
FNDA:0,$s4Kima9KimPinYinC7convertyS2SF
FNDA:0,$sSa4Kima8KimModel0B12SelectMemberCRszlE23sortByDisplayNamePinyinSayADGyF
FNDA:0,$sSa4Kima8KimModel0B12SelectMemberCRszlE23sortByDisplayNamePinyinSayADGyFSbSS_Sit_SS_SittXEfU_
FNDA:0,$sSa4Kima8KimModel0B12SelectMemberCRszlE23sortByDisplayNamePinyinSayADGyFADSgSS_SitXEfU0_
FNDA:0,$sSa4Kima8KimModel0B4UserVRszlE23sortByDisplayNamePinyinSayADGyF
FNDA:0,$sSa4Kima8KimModel0B4UserVRszlE23sortByDisplayNamePinyinSayADGyFSbSS_Sit_SS_SittXEfU_
FNDA:0,$sSa4Kima8KimModel0B4UserVRszlE23sortByDisplayNamePinyinSayADGyFADSgSS_SitXEfU0_
FNDA:0,$sSa4Kima8KimModel0b18GroupMemberContactC0CRszlE23sortByDisplayNamePinyin15moveAdminToFistSayADGSb_tF
FNDA:0,$sSa4Kima8KimModel0b18GroupMemberContactC0CRszlE23sortByDisplayNamePinyin15moveAdminToFistSayADGSb_tFSbSS_Sit_SS_SittXEfU_
FNDA:0,$sSa4Kima8KimModel0b18GroupMemberContactC0CRszlE23sortByDisplayNamePinyin15moveAdminToFistSayADGSb_tFADSgSS_SitXEfU0_
FNF:14
FNH:1
DA:16,2
DA:17,2
DA:18,2
DA:20,0
DA:21,0
DA:22,0
DA:23,0
DA:24,0
DA:25,0
DA:26,0
DA:28,0
DA:29,0
DA:30,0
DA:31,0
DA:33,0
DA:34,0
DA:35,0
DA:36,0
DA:37,0
DA:38,0
DA:42,0
DA:43,0
DA:44,0
DA:45,0
DA:46,0
DA:47,0
DA:48,0
DA:49,0
DA:50,0
DA:51,0
DA:52,0
DA:53,0
DA:54,0
DA:55,0
DA:56,0
DA:60,0
DA:61,0
DA:62,0
DA:63,0
DA:64,0
DA:65,0
DA:66,0
DA:67,0
DA:68,0
DA:69,0
DA:70,0
DA:71,0
DA:72,0
DA:73,0
DA:74,0
DA:78,0
DA:79,0
DA:80,0
DA:81,0
DA:82,0
DA:83,0
DA:84,0
DA:85,0
DA:86,0
DA:87,0
DA:88,0
DA:89,0
DA:90,0
DA:91,0
DA:92,0
DA:93,0
DA:94,0
DA:95,0
DA:96,0
DA:97,0
DA:98,0
DA:99,0
DA:100,0
BRF:0
BRH:0
LF:91
LH:3
end_of_record
文件中有多個這樣的數據塊組成,現在需要對這個數據塊進行分析,以便進行跨版本的覆蓋率合并。但是,從網上搜索相關介紹的時候,幾乎是沒有的。于是我們只能借助于其他的數據進行比對,比如說,生成html報告,使用如下命令:
xcrun llvm-cov show ./binapp --instr-profile=./commitA/coverage_mergedA.profdata --format=html -use-color --output-dir=./commitA/checkreport
打開報告,內容如下:
然后對照著這兩份數據,就可以大概了解一下相關的內容了:
1,類下的信息
SF:/Users/sxf/Documents/精準測試/KimCode/iOSSDKInject/kim-ios/packages/kim-ios/Kim/DataHelper/KImPinYin.swift
FN:16,$s4Kima9KimPinYinC7preloadyyFZ
FN:20,$s4Kima9KimPinYinCACycfc
FN:24,$s4Kima9KimPinYinCfD
FN:28,$s4Kima9KimPinYinC12pinyinLoadedyyF
FN:33,$s4Kima9KimPinYinC7convertyS2SF
FN:42,$sSa4Kima8KimModel0B12SelectMemberCRszlE23sortByDisplayNamePinyinSayADGyF
FN:49,$sSa4Kima8KimModel0B12SelectMemberCRszlE23sortByDisplayNamePinyinSayADGyFSbSS_Sit_SS_SittXEfU_
FN:52,$sSa4Kima8KimModel0B12SelectMemberCRszlE23sortByDisplayNamePinyinSayADGyFADSgSS_SitXEfU0_
FN:60,$sSa4Kima8KimModel0B4UserVRszlE23sortByDisplayNamePinyinSayADGyF
FN:67,$sSa4Kima8KimModel0B4UserVRszlE23sortByDisplayNamePinyinSayADGyFSbSS_Sit_SS_SittXEfU_
FN:70,$sSa4Kima8KimModel0B4UserVRszlE23sortByDisplayNamePinyinSayADGyFADSgSS_SitXEfU0_
FN:78,$sSa4Kima8KimModel0b18GroupMemberContactC0CRszlE23sortByDisplayNamePinyin15moveAdminToFistSayADGSb_tF
FN:85,$sSa4Kima8KimModel0b18GroupMemberContactC0CRszlE23sortByDisplayNamePinyin15moveAdminToFistSayADGSb_tFSbSS_Sit_SS_SittXEfU_
FN:88,$sSa4Kima8KimModel0b18GroupMemberContactC0CRszlE23sortByDisplayNamePinyin15moveAdminToFistSayADGSb_tFADSgSS_SitXEfU0_
FNDA:2,$s4Kima9KimPinYinC7preloadyyFZ
FNDA:0,$s4Kima9KimPinYinCACycfc
FNDA:0,$s4Kima9KimPinYinCfD
FNDA:0,$s4Kima9KimPinYinC12pinyinLoadedyyF
FNDA:0,$s4Kima9KimPinYinC7convertyS2SF
FNDA:0,$sSa4Kima8KimModel0B12SelectMemberCRszlE23sortByDisplayNamePinyinSayADGyF
FNDA:0,$sSa4Kima8KimModel0B12SelectMemberCRszlE23sortByDisplayNamePinyinSayADGyFSbSS_Sit_SS_SittXEfU_
FNDA:0,$sSa4Kima8KimModel0B12SelectMemberCRszlE23sortByDisplayNamePinyinSayADGyFADSgSS_SitXEfU0_
FNDA:0,$sSa4Kima8KimModel0B4UserVRszlE23sortByDisplayNamePinyinSayADGyF
FNDA:0,$sSa4Kima8KimModel0B4UserVRszlE23sortByDisplayNamePinyinSayADGyFSbSS_Sit_SS_SittXEfU_
FNDA:0,$sSa4Kima8KimModel0B4UserVRszlE23sortByDisplayNamePinyinSayADGyFADSgSS_SitXEfU0_
FNDA:0,$sSa4Kima8KimModel0b18GroupMemberContactC0CRszlE23sortByDisplayNamePinyin15moveAdminToFistSayADGSb_tF
FNDA:0,$sSa4Kima8KimModel0b18GroupMemberContactC0CRszlE23sortByDisplayNamePinyin15moveAdminToFistSayADGSb_tFSbSS_Sit_SS_SittXEfU_
FNDA:0,$sSa4Kima8KimModel0b18GroupMemberContactC0CRszlE23sortByDisplayNamePinyin15moveAdminToFistSayADGSb_tFADSgSS_SitXEfU
類中的函數信息:
FN:16,$s4Kima9KimPinYinC7preloadyyFZ
- FN:代表方法
- 16:代表開始行號
- 后面的是方法名以及模塊相關的信息。
FNDA:2,$s4Kima9KimPinYinC7preloadyyFZ
- FNDA:代碼方法的覆蓋情況
- 2:代表方法中的代碼可能執行的次數,但不一定是所有的行都執行了,需要具體分析;
- 后面的是方法信息,與FN相照應。
2,方法覆蓋率信息
FNF:14 FNH:1
通過對比html報告,可以看出:
FNF:代碼這個文件中的總方法數;
FNH:為覆蓋的方法數
而我們合并覆蓋率報告的時候,可以先對比一下總方法數是否一樣,如果相同,再去考慮如何處理覆蓋的方法數;如果不同,則選擇最新版本的方法數;在生成增量報告的時候,無需要修改此處內容,生成的報告會根據函數信息,直接展示函數覆蓋情況。
3,行覆蓋率信息
LF:91 LH:3
LF: 代碼這個文件的總行數,總行數以最新的版本為準;
LH:為覆蓋的行數,合并覆蓋率后,需要統計一下合并后的覆蓋行號,更新一下這個數;
DA:84,0
DA:XX 代表文件中的第幾行
0:最后的數字代碼此行執行了多少次,如果為0則表示沒有執行到,也就是沒有覆蓋。
4,分支覆蓋
BRF:0 BRH:0
BRF:為總分支數
BRH:為覆蓋的分支數,一般的Swift文件都是0
2.6.6 iOS增量報告生成
通過分析info文件,再結合獲取一個需求的diff信息,就能生成對應的增量覆蓋率。具體邏輯如下所示:
1,根據一定的diff策略,拿到對應需求的diff文件以及diff的行號。
由于git diff得到的信息,再計算相應的diff行號,可能存在有些行不是開發修改的行號;雖然情況不多,但也是有存在的機率。
2,根據diff信息,再過濾全量報告的allreport.info文件
3,遍歷完所有的diff文件,生成增量報告diffreport.info文件;
4,通過genhtml命令,將diffreport.info文件,生成增量覆蓋率報告。
genhtml -o diffreport diffreport.info