今天我的任务是在我们的代码库中添加单元测试覆盖分析。今天也是 iOS 7.1 与 XCode 5.1 一起发布的日子。从发行说明:
重新实现了用于代码覆盖测试的 gcov 工具。新版本使用来自 LLVM 项目的 llvm-cov 工具。它在功能上等同于旧版本的所有重要特性。Xcode 中 gcov 的位置也移动了,使用 xcrun 调用它。如果您发现问题,请提交错误报告。对于此版本,您仍然可以使用来自 GCC 的旧版本 gcov,它以 gcov-4.2 的形式提供。11919694 更新
我只是在阅读了几篇指导性 博客 文章后才意识到这一点,正确设置了我的环境-在测试时在模拟器的构建文件夹中生成 .gcda/.gcno 文件-并让此处的报告生成工具尝试将它们解析为报告。(这是一个 ./getcov 脚本,它收集您的环境变量以传递给 lcov-1.10 脚本以生成报告)
第一个障碍是新的捆绑gcov
程序不支持获取版本的参数,这是初始化-v
的第一步。lcov
似乎已经不是初学者了,但是阅读上面的发行说明,我修改了lcov
脚本以使用旧gcov-4.2
版本并解决了这个问题。
但是,lcov
在处理我的覆盖数据文件时很早就出错了。这会生成一个报告,其中可能包含我项目中按字母顺序排列的前 10 个左右的文件。不是特别有用。错误输出也很小且无济于事:
geninfo: 错误: (build_artifacts)/(class_that_errored).gcda 的 GCOV 失败!
我修改了lcov
脚本以打印它得到的错误(11
不幸的是,它只产生了,在 gcov(-io).c 代码中找不到任何引用)并继续操作而不是退出,所以我留下了更多报告中的文件,但仍然可能有 85% 的源文件如上所述错误。
在报告中成功结束的文件和引发错误的文件之间,我能辨别的唯一模式是任何使用内联块声明的文件都失败了。没有以任何方式通过使用块的文件,并且我检查过的所有失败的文件都包含块。奇怪的。
然后我发现我可以打开CoverStory中的各个 .gcda 文件,包括那些在lcov
脚本中出错的文件。在覆盖率报告下方的消息窗口中,所有出错的文件都有警告消息:
(class_that_errored).gcno: '__copy_helper_block_' 没有行
(class_that_errored).gcno: '__destroy_helper_block_' 没有行
在这一点上,我最好的假设是新的 XCode 5.1 正在生成旧gcov-4.2
程序无法处理有关块声明的 .gcda 文件。
但是我已经用尽了所有我能想到的尝试,所以我在这里询问是否有人有我错过的知识,或者有任何想法来进一步调试工作。或者,如果自从今天的 XCode 5.1 更新后,有人成功地测量了测试覆盖率gcov
,我也很想听听您必须做出的任何更改。