【问题标题】:GCovr does not generate a valid reportGCovr 未生成有效报告
【发布时间】:2013-03-26 18:54:27
【问题描述】:

我想使用 Cobertura 设置我的 Jenkins 以跟踪代码覆盖率。 不幸的是,我无法生成有效的 xml。

我正在使用:

  • gcovr 2.5 预发布版 (r2774)
  • Xcode 4.6.1 构建版本 4H512

我的项目正在正确生成代码覆盖率文件,但使用 gcovr 创建的报告没有用。

我用来生成报告的命令是:

gcovr -r /Users/Shared/Jenkins/Home/jobs/CodeCoverage/workspace 
--object-directory /Users/Shared/Jenkins/Home/Library/Developer/Xcode/DerivedData/myProject-aooceqwwovrizceerghqvhflcfty//Build/Intermediates/myProject.build/Development/myProject.build/Objects-normal/x86_64 
--exclude '.*Developer.*' 
--exclude '.*Tests.*' 
--xml

这将为我创建这个输出:

<?xml version="1.0" ?>
<!DOCTYPE coverage SYSTEM 'http://cobertura.sourceforge.net/xml/coverage-03.dtd'>
<coverage branch-rate="0.0" line-rate="0.0" timestamp="1364322914" version="gcovr 2.5-prerelease (r2774)">
<sources>
    <source>
        /Users/Shared/Jenkins/Home/jobs/CodeCoverage/workspace/Project/myProject/
    </source>
</sources>
<packages/>
</coverage>

其他信息:

如果我删除 --object-directory 和 -r 然后我从派生数据目录执行命令,则会生成有效报告。该报告可以从 cobertura 读取,但不能显示有关源文件的任何详细信息。

【问题讨论】:

  • 我实际上是因为使用 gcovr 而辞职的。我正在使用一组 shell 脚本来生成 XML。首先我运行 gcov,然后我排除了特殊 cmets 之间的一些行(我正在使用 CoverStory),然后我从 gcov 输出的第一列生成 XML。其实很简单,你也可以直接在你的workspace里引用源文件,这样你就可以很方便的查看jenkins上文件的覆盖率了。
  • @Sulthan 您是否可以共享您的脚本?我无法让 gcovr 处理 Xcode 5 生成的文件,我正在寻找不同的解决方案。谢谢!

标签: objective-c jenkins code-coverage cobertura gcovr


【解决方案1】:

在使用 XCode 时,我发现使用 $WORKSPACE/build 作为构建目录有助于解决这个问题。这将派生数据目录排除在外,并将我的目标文件整齐地保存在构建目录中。它还可以防止两个构建相互干扰。

如果使用 Xcode 构建工具,请在工具的构建配置中将 SYMROOT 设置为 $WORKSPACE/build。如果您从命令行构建,请在命令行或环境中手动设置。

然后是一个gcovr脚本如:

/your/path/to/gcovr -r . --object-directory build/YourApp.build/Coverage-iphonesimulator/YourApp.build/Objects-normal/i386 --xml > build/coverage.xml

(您的路径可能会略有不同,具体取决于您所称的构建风格等)

最后在 Cobertura 配置中,指向 build/coverage.xml,当您在 Jenkins 中使用该工具时,您应该会获得带注释的源代码。

应该做的伎俩。我对我们小型 Mac Mini 农场的配置非常满意。

【讨论】:

  • 您的解决方案很有趣,所以我尝试应用一些更改。当我为 CONFIGURATION_BUILD_DIR 或 SYMROOT 设置自定义路径时,xcodebuild 会在指定文件夹中生成一些文件。这些文件只是应用程序和符号信息。对象目录仍在 Derived Data 下。
  • 您是在使用 xcode 插件还是其他东西来构建您的 xcode?如果您不使用 xcode 插件,您可以将xcodebuild 命令的脚本添加到问题中吗?有许多“下游”设置通常将 .o 文件放置在 SYMROOT 中描述的路径中,但许多可以在项目中更改。
  • xcodebuild -workspace myProject.xcworkspace -scheme myProject-Development clean build BUILD_DIR=/Users/Shared/Jenkins/Home/jobs/CodeCoverage/workspace/Project/build/TEST_AFTER_BUILD=YES
  • 检查您的 Xcode 项目配置。通常 SYMROOT 位于所有 BUILD 目录的顶部,最值得注意的是:BUILT_PRODUCTS_DIR 和 CONFIGURATION_BUILD_DIR。其他一切都应该从那里流下来。如果您在项目配置中找不到任何可疑的内容,请在 Jenkins 中提取原始日志,并查看是否可以将在构建过程中设置的变量放到您看到对象文件所在的位置。这应该提供一些线索。
  • BUILT_PRODUCTS_DIR 和 CONFIGURATION_BUILD_DIR 都无法移动派生数据目录。我在传递给 xcodebuild 的参数中找到了一个始终使用绝对路径而不是相对路径的工作解决方案。通过这种方式,我可以获得一份完整的 cobertura 工作报告。我仍然有兴趣为我的工作找到一个静态派生数据目录的方法,它使一切都更加可靠。
【解决方案2】:

gcovr 应该从 .gcda 和 .gcno 文件所在的文件夹中执行。根路径是源文件(.c 或 .cpp)所在的文件夹。

这样,命令看起来如下所示。

rr-mac:gcdaFolder$ gcovr -r /path_to_C_sourceFiles/ .

对于输出 html 文件下面的命令有效

rr-mac:gcdaFolder$ gcovr --html -o Filename_rp.html -r /path_to_C_sourceFiles/ .

注意:末尾的点(.)是强制性的

【讨论】:

  • '.' 是什么意思最后指定?
  • '.'指定当前目录
【解决方案3】:

gcovr python 脚本似乎不支持源代码树之外的构建。

我在这里https://github.com/gcovr/gcovr/issues/61提出了一个关于此的错误报告

【讨论】:

    猜你喜欢
    • 2018-04-10
    • 2019-05-15
    • 2021-09-21
    • 2021-09-09
    • 2022-06-13
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    相关资源
    最近更新 更多