使用Slather将代码覆盖范围添加到Zendesk的iOS SDK版本中

测试覆盖范围的扩大是Zendesk Mobile SDK团队的一项持续任务。 有什么比在每次拉动请求中都提示的更好的方法来帮助实现这一点。 让我们知道我们是否正在朝着目标迈进。

早在2014年,我们的iOS SDK就开始使用Xcode 5进行工作。那时,它是一个静态库。 从那以后,它经历了许多更改和Xcode版本。 如今,这是一个由等量的Swift和Objective C编写的动态框架。Xcode项目会迅速收集灰尘,而将新工具集成到旧项目中的工作很少能顺利进行。

我们最近将危险集成到我们的项目中。 危险使代码检查的某些方面自动化。 我们一直将它用于简单的任务,例如警告我们代码中遗留的待办事项或格式错误的提交消息。 设置既简单又易于使用,它具有大量可用的插件。

Slather生成测试覆盖率报告,并旨在加入CI。 还有一个危险插件。 将其添加到我们的项目看起来很简单。

  1. gem install danger-slather
  2. 在我们要报告测试覆盖率的方案的危险文件配置slather上添加一行。
  3. 添加另一行以显示输出。

推送至GitHub,等待Travis完成。

 错误:无法加载覆盖率。 找不到覆盖率数据。 
 总覆盖率:NaN% 

无论如何,这似乎太不可思议了。

错误消息很清楚。 我们要么没有生成代码覆盖率数据,要么Slather无法找到它。

首先,我们需要检查是否正在生成覆盖率数据。 这是在要覆盖数据的方案的测试设置中完成的。 另外,可以将enableCodeCoverage传递给xcodebuild。

在这一点上,我们假设coverage数据与构建输出位于同一位置。 我们正在将OBJROOT传递给xcodebuild,并且可以在那里看到构建输出。 我们已经将Slather配置为在同一目录中查找二进制文件以对其进行覆盖。 我们仍然No coverage directory found从Slather No coverage directory found

我们使用bundle show slather slather查看了Slather的代码,发现它正在运行:

  build_command =“ xcodebuild#{projectOrWorkspaceArgument}#{schemeArgument} -showBuildSettings 

此命令获取方案中包含的所有信息。 OBJROOT不会选择将OBJROOT或任何其他环境变量传递给xcodebuild。 我们还尝试将OBJROOT添加到方案的构建设置中,但这没有效果。

在了解了代码覆盖率的输出位置之后,我们意识到它始终保存在DerivedData 。 将binary_file添加到Slather的配置中迫使它在错误的位置查找。 删除此参数允许Slather在本地运行。

然后,我们尝试使用Travis的调试作业功能来查看coverage输出的位置。 调试作业将启动Travis计算机,拉动代码并设置环境。 它不会运行构建的任何部分。 您的环境可能需要更多设置。 在我们的例子中,我们要做的就是在构建之前运行bundle install

在调试环境中运行测试也有问题。 启动运行UI测试时,模拟器挂起。 在运行UI测试之前,可以通过启动模拟器来“预热”模拟器。 但是它不能可靠地工作。

目前,我们对获取完整的覆盖率数据不感兴趣,因此我们禁用了UI测试。

我们确认Coverage.prof位于~/Library/Developer/Xcode/DerivedData/ZendeskSDK的默认派生数据位置,后跟类似于UID的内容。

然后,我们花费了大量时间尝试配置代码覆盖率信息的输出位置。 我们希望它成为构建目录。 我们的理由是,无法按项目设置DerivedData的位置。 它只能在Xcode中全局设置。 无法在Travis上配置其位置。 项目DerivedData路径末尾的UID意味着我们也无法在Slather的配置中设置位置。 我们无法找到一种配置覆盖率数据输出位置的方法。

阅读了Slather的源代码后,我们意识到它包含很多逻辑来定位派生数据和Coverage.prof文件。 最后,解决方案很简单。 删除用于Slather配置的binary_file参数。

最后一个障碍。 Slather现在正在读取Travis中的覆盖率数据,但仍在报告NaN 。 原来这是另一个配置错误的构建设置。 我们正在为调试中的所有体系结构构建。 测试只能在活动架构上运行,因此覆盖率数据仅针对该架构生成。 据推测,Slather会尝试为其找到的每个已编译文物查找覆盖率数据。 将ONLY_ACTIVE_ARCH设置为yes ONLY_ACTIVE_ARCH此最后一个问题。 现在,我们的请求请求中包含代码覆盖率信息!

摘要

他们的重点是:

  • 代码覆盖率数据Coverage.prof输出到DerivedDataOBJROOT
  • 不能按项目设置派生数据的位置。 只能在Xcode中全局设置。 OBJROOT没有影响。
  • Slather包含很多逻辑来查找代码覆盖率数据。
  • Slather读取方案配置以获取其所需的所有信息。
  • 可以在方案设置中或通过传递-enableCodeCoverage来启用代码覆盖率
  • 对于调试配置,仅在使用Slather时才针对活动体系结构进行编译。

Interesting Posts