美文网首页
iOS代码覆盖率检测方案

iOS代码覆盖率检测方案

作者: 哈lemon | 来源:发表于2020-01-15 14:52 被阅读0次

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到被测试工程根目录
  1. 下载链接:https://github.com/daihongchao/XcodeCoverage/tree/master
  2. 也可以用CocoaPods下载:在Podfile文件里面添加第三方库 pod'XcodeCoverage','~>1.0'
  3. 在自己的工程中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 打包测试
  1. 编译运行,生成.ipa或则对应的framework。
  2. 如果将framework嵌入到测试自动化跑的demo中,然后运行生成对应的ipa。
4.1.2 测试人员测试提取.gcda文件
4.1.2.1 测试步骤
  1. 手机运行如上的ipa。
  2. 运行测试完想要的业务逻辑。然后退出应用。
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文件环境
  1. 查看手机设备的Documents/arm64/, 拷贝里面的所有.gcda文件

  2. 进入项目目录XcodeCoverage, 打开env.sh, 找到 OBJECT_FILE_DIR_normal属性和CURRENT_ARCH属性的值, 这里要注意下如果CURRENT_ARCH的值是undefined就改成arm64(关键)

  3. 打开Finder,使用shift+command+G按钮输入/,其中 OBJECT_FILE_DIR_normalCURRENT_ARCH 是上一步找到的值,(尖括号注意去掉)

  4. 把上面获取到的所有.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

相关文章

网友评论

      本文标题:iOS代码覆盖率检测方案

      本文链接:https://www.haomeiwen.com/subject/irytzctx.html