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