XcodeCoverage 为生成 Xcode 项目的 Objective-C 代码覆盖率报告提供了一个简单的方法。生成的报告包括 HTML 和 Cobertura XML。
覆盖率数据不包含 Apple 的 SDK,并且排除规则可以自定义。
遗憾的是,Swift 覆盖率目前不受支持。
安装:标准
如果您想要自定义 XcodeCoverage 以排除某些文件和目录,例如第三方库,请使用标准安装。否则,下面的 CocoaPods 安装可能更方便。
- 将该仓库 Fork。
- 将 XcodeCoverage 文件夹放置在与您的 Xcode 项目相同的文件夹中。
- 在您的目标主项目的 "构建阶段" 中,添加一个运行脚本构建阶段来执行
XcodeCoverage/exportenv.sh
有些人被最后一步难住了:请确保您将该脚本添加到您的目标主项目(您的应用程序或库),而不是测试目标。
安装:CocoaPods
为了在简单的项目中方便使用,已经添加了一个 CocoaPod。如果您使用 CocoaPod 而不是标准方法,请注意以下事项
- 项目实际上不会添加任何文件。文件仅通过
preserve_paths
添加,因此它们将位于您的Pods/XcodeCoverage
路径中,但在 Xcode 中您将看不到它们,并且 Xcode 也不会编译它们。 - 您无法修改脚本,除非那些修改被 CocoaPods 覆盖。
如果这些注意事项是无法接受的,请使用上述标准安装方法。
通过 CocoaPods 安装的步骤
- 将
pod 'XcodeCoverage', '~>1.0'
(或者您希望的任何 版本指定) 添加到您的Podfile中。 - 运行
pod install
。这将会下载必要的文件。 - 在您的主体目标中,添加一个执行脚本构建阶段来执行
Pods/XcodeCoverage/exportenv.sh
。
再次确认,将脚本添加到您的主体目标(您的应用程序或库)中,而不是测试目标中。
Xcode项目设置
XcodeCoverage附带了一个xcconfig文件,其中包含了用于为覆盖分析设置你代码所需的构建设置。
如果你已经使用了一个xcconfig,将其包含你要设置覆盖分析的应用中
- 标准安装:
#include "XcodeCoverage/XcodeCoverage.xcconfig"
- CocoaPods安装:
#include "Pods/XcodeCoverage/XcodeCoverage.xcconfig"
如果你还没有使用xcconfig,将XcodeCoverage.xcconfig拖入你的项目。当提示“添加到目标”时,取消选择所有目标。(否则,它将被包含在包中。)然后点击Xcode的“导航器”面板中的项目,并选择“信息”选项卡。对于你要设置覆盖分析的计算配置,选择XcodeCoverage。
如果愿意手动指定构建设置,请在项目级别启用以下两个设置
- 指示程序流程
- 生成旧版测试覆盖文件
确保不要为AppStore发布版设置覆盖分析。
执行
- 运行您的单元测试。
- 在终端中,在项目的XcodeCoverage文件夹中执行
getcov
。
getcov
有以下命令行选项
--show
或-s
:显示HTML报告。--xml
或-x
:生成Cobertura XML。-o output_dir
:指定输出目录。-i info_file
:指定生成的lcov info文件名。-v
:启用详细输出。-h
或--help
:显示用法。
如果你在更改测试代码而不是生产代码时想要一个干净的平板,请使用 cleancov
脚本。
如果你的生产代码有任何更改,请在再次测量代码覆盖之前清除所有构建工件。在Xcode的“产品”菜单中按住Option键执行“清洁构建文件夹”,或使用⌥⇧⌘K键组合。
(可选)XcodeCoverage可以在运行单元测试后提示运行代码覆盖
- 编辑Xcode方案 -> 测试 -> 后续操作
- 将“Shell”设置为:
/bin/bash
- 将“提供构建设置”从设置为你的主要目标
- 将脚本设置为
source XcodeCoverage/run_code_coverage_post.sh
(标准安装)。对于CocoaPods安装,使用source Pods/XcodeCoverage/run_code_coverage_post.sh
从覆盖率中排除文件
如果您想让覆盖率生成器忽略某些文件或文件夹(例如,未通过 CocoaPods 安装的第三方库或机器生成的文件),请将 .xcodecoverageignore
文件添加到您的 SRCROOT
中。
每一行应该是一个不同的文件或文件组,这些文件或文件组应该用于覆盖率排除。您可以同时使用 SRCROOT
相对路径以及 *
字符来表示应该排除一定目录下的所有内容。
以下是一个 .xcodecoverageignore
文件的示例内容
${SRCROOT}/TestedProject/Machine Files/*
${SRCROOT}/TestedProject/Third-Party/SingleFile.m
${SRCROOT}/TestedProject/Categories/UIImage+IgnoreMe.{h,m}
注意:如果您之前使用的是 XcodeCoverage 1.3 之前的版本,您需要将您想要忽略的文件和文件夹列表移动到 .xcodecoverageignore
文件中。当前的设置将防止在更新此项目时您的自定义列表被覆盖。
致谢
lcov
-> Cobertura 脚本来自 https://github.com/eriwen/lcov-to-cobertura-xml/ 并受该项目的许可证约束。