iOS代码覆盖率检测方案
1. 背景
当前iOS端,没有一套可以进行代码覆盖率检测的工具。
代码覆盖(Code coverage)是软件测试中的一种度量,描述程式中源代码被测试的比例和程度,所得比例称为代码覆盖率。
代码覆盖率检测工具的作用是测试单元测试代码的覆盖率。或则是业务功能测试代码的覆盖率。覆盖测试是衡量测试质量的一个重要指标。如果当前有一套可以很好的检测到我们当前的代码覆盖率,那就可以很好的提升代码的质量。减少冗余的代码。
2. 工具的调研
| XcodeCoverage | Xcode 自带的Coverage | |
|---|---|---|
| 支持SDK工程 | 支持 | 支持 |
| 支持范围 | 可以业务的流程覆盖率检测 | 支持单元覆盖率检测 |
| 能独立生成报告 | 可以 | 不可以(报告在xcode运行中,导不出来) |
<font color=red>3. 使用建议</font>
在我们的项目中,XcodeCoverage和Xcode 自带的Coverage这两个工具可以并行使用。
XcodeCoverage的工具可以用来支持业务流程代码覆盖率测试,测试多个业务流程测试用例,覆盖率会相应进行叠加。
Xcode 自带的Coverage可以用于研发人员做单元测试的时候,可以查看单元测试的代码覆盖率。
4. 测试覆盖率在测试中的使用
4.1 XcodeCoverage在测试自动化中的使用
4.1.1 设置能生成覆盖率数据的APP/SDK
4.1.1.1 下载XcodeCoverage到被测试工程根目录
- 下载链接:https://github.com/daihongchao/XcodeCoverage/tree/master
- 也可以用CocoaPods下载:在Podfile文件里面添加第三方库 pod'XcodeCoverage','~>1.0'
- 在自己的工程中Run Script中配置运行脚本 Pods/XcodeCoverage/exportenv.sh
image-20191125161208709
4.1.1.2 对工程做配置
对主工程及依赖工程对应的测试覆盖率的打包模式在Build Settings做如下配置:
-
Generate Debug Symbols 配置成YES
-
Generate Legacy Test Coverage Files 配置成YES
-
Instrument Program Flow 配置成YES
-
Preprocessor Macros 增加字段COVERAGE=1。
image-20191125161901087
4.1.1.3 项目源码中添加生成覆盖率的相关代码
当程序被拉到退出应用时调用__gcov_flush()生成.gcda文件,此文件中记录了代码覆盖率,注意__gcov_flush()可重复调用,记录为追加写。
当前SDK可以选择在退出应用的使用调用覆盖率的相关代码
#if COVERAGE
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
setenv("GCOV_PREFIX", [documentsDirectory cStringUsingEncoding:NSUTF8StringEncoding], 1);
setenv("GCOV_PREFIX_STRIP", "13", 1);
extern void __gcov_flush(void);
__gcov_flush();
#endif
4.1.1.4 打包测试
- 编译运行,生成.ipa或则对应的framework。
- 如果将framework嵌入到测试自动化跑的demo中,然后运行生成对应的ipa。
4.1.2 测试人员测试提取.gcda文件
4.1.2.1 测试步骤
- 手机运行如上的ipa。
- 运行测试完想要的业务逻辑。然后退出应用。
4.1.2.2 提取.gcda文件
-
SDK库:
-
iOS Simulator :
.gcda文件会生成到默认路径
~/Library/Developer/Xcode/DerivedData/iOSProj-cndbgdtazzzhaebuyvgjsqmkvwdr/Build/Intermediates/MyApp.build/Debug-iphonesimulator/MyApp.build/Objects-normal/i386·下 -
iPhone : .gcda文件会生成到对应App沙盒
Document/${CURRENT_ARCH}/下
-
-
APP:
-
iOS Simulator :
.gcda文件会生成到默认路径
~/Library/Developer/Xcode/DerivedData/iOSProj-cndbgdtazzzhaebuyvgjsqmkvwdr/Build/Intermediates/MyApp.build/Debug-iphonesimulator/MyApp.build/Objects-normal/i386·下 -
iPhone : .gcda文件会生成到对应App沙盒
Objects-normal/Document/${CURRENT_ARCH}/下
-
4.1.2.3 测试人员将.gcda文件回传给打包framework/app的服务器(可实现自动化)
4.1.3 生成覆盖率报告(后续可通过自动化实现)
4.1.3.1 修改XcodeCoverage目录下的env.sh文件环境
-
查看手机设备的Documents/arm64/, 拷贝里面的所有.gcda文件
-
进入项目目录XcodeCoverage, 打开env.sh, 找到 OBJECT_FILE_DIR_normal属性和CURRENT_ARCH属性的值, 这里要注意下如果CURRENT_ARCH的值是undefined就改成arm64(关键)
-
打开Finder,使用shift+command+G按钮输入
/,其中OBJECT_FILE_DIR_normal及CURRENT_ARCH是上一步找到的值,(尖括号注意去掉) -
把上面获取到的所有.gcda文件拷贝到第3步打开的目录:
OBJECT_FILE_DIR_normal/CURRENT_ARCH中[图片上传失败...(image-153615-1579071075406)]
4.1.3.2 查看覆盖率报告
打开终端, cd进入项目目录XcodeCoverage, 运行命令:
./getcov --show
image-20191125173437195
image-20191125173537765
4.2 研发做单元测试覆盖率的方法
4.2.1测试工程确认打开 code coverage
在运行测试之前,我们必须先确认 code coverage 是否被打开了,写代码时,默认是关闭的。所以你需要编辑一下你的测试 scheme,把它打开。
image-20191021181339906
4.2.2运行单元测试
image-20191021181528542
4.2.3 查看结果
点开对应的文件可以查看对应的代码执行的次数
image-20191021181608290










网友评论