【问题标题】:Generating .gcda files after running unit tests on Xcode bot在 Xcode bot 上运行单元测试后生成 .gcda 文件
【发布时间】:2014-04-18 20:02:02
【问题描述】:

我想知道当 iOS 应用程序在 Xcode 机器人上运行单元测试时如何生成 gcda 文件。

我使用this blog 配置 Xcode 以生成测试覆盖率文件并使用利用 lcov 的脚本生成报告。我可以在我的开发计算机上始终如一地创建覆盖文件和报告,但是当机器人尝试相同的过程时,不会出现 .gcda 文件。在bot上调用__gcov_flush()时,在日志中可以看到如下错误:

profiling:/Library/Server/Xcode/Data/BotRuns/Cache/c0jhd288-c473-c473-2432-f8219hdh98dh89/DerivedData/Build/Intermediates/AppName.build/Debug-iphonesimulator/appName.build/Objects-normal/i386/ClassName.gcda: cannot open

我知道这是在应用程序的 gcov 刷新期间发生的,因为我直接在调用前后放置了一个日志”

NSLog(@"[application performSelector:@selector(gtm_gcov_flush)]; will be CALLED");
[application performSelector:@selector(gtm_gcov_flush)];
NSLog(@"[application performSelector:@selector(gtm_gcov_flush)]; was CALLED");

注意:gtm_gcov_flush 只调用__gcov_flush(),没有别的。

搜索“profile gcda:无法打开”引导我here,但我已经按照上面的博客链接遵循建议的要求。可能存在一些权限问题,但这似乎不太可能,因为 Xcode 是生成 gcda 文件的那个。

我已经检查了 /Library/Server/Xcode/Data/BotRuns//Users/username/Library/Developer/Xcode/DerivedData//var/_xcstest 目录及其子目录中的 gcda 文件,但看不到任何内容。不过/Library/Server/Xcode/Data/BotRuns/Cache/c0jhd288-c473-c473-2432-f8219hdh98dh89/DerivedData/Build/Intermediates/AppName.build/Debug-iphonesimulator/appName.build/Objects-normal/i386/里面有gcno、o、d、dia文件(这里应该有gcda文件)。

就像我说的,我在本地运行时遇到的问题为零。脚本 XcodeCoverage/getcov 在我的方案中存档的后操作阶段被调用。我在我的开发 Mac 上以及通过 CI 服务器上的 Xcode 服务使用 Xcode 5.0.2。正在使用 XCTest 框架运行单元测试。

提前感谢您的帮助!

【问题讨论】:

    标签: ios xcode unit-testing continuous-integration


    【解决方案1】:

    好吧,看起来这确实是怀疑的权限问题。我找到了使用 Xcode 5+ 生成代码覆盖率报告的绝佳参考:

    http://www.bubblefoundry.com/blog/2013/11/code-coverage-revisited/

    如上篇文章所述,有两个用户管理 Xcode 机器人,_teamserver 和 _xcstest。 _xctest 没有与 _teamserver 相同的权限,因此必须将 .gcda 文件的目标文件夹的权限设置为允许 _xctest 访问(即组访问该文件夹)。我按照文章的建议实现了脚本,但我的 CI 服务器在存档期间崩溃了。显然在归档时,文件夹引用不存在。所以我将其更新为:

    # Setting these permissions is required to successfully flush
    # test coverage data with __gcov_flush();
    
    if [ -d ${OBJECT_FILE_DIR_normal}/i386 ]; then
        chmod 775 ${OBJECT_FILE_DIR_normal}/i386
    fi
    

    除了成功生成覆盖文件之外,我还将它们复制到另一个文件夹。我的测试覆盖率报告是在存档的后操作阶段生成的,在那个阶段我找不到访问这些文件的方法。原因是它们是在

    中生成的

    /Library/Server/Xcode/Data/BotRuns/Cache/c0jhd288-c473-c473-2432-f8219hdh98dh89/DerivedData/Build/Intermediates/AppName.build/Debug-iphonesimulator/appName.build/Objects-normal/i386/

    但是存档运行在:

    /Library/Server/Xcode/Data/BotRuns/Cache/c5f4462c-c473-c473-2432-5ac4d0b46nal/DerivedData/Build/Intermediates/ArchiveIntermediates/AppName/BuildProductsPath/Release-iphoneos/

    可能有一种聪明的方法可以在稍后引用时导出覆盖文件的目录,但我不确定。最后,无论如何我都不是终端的超级用户,所以请随时提供建议!

    请注意,我还参考了这些博客来帮助完成配置:

    http://matt.vlasach.com/xcode-bots-hosted-git-repositories-and-automated-testflight-builds/

    http://qualitycoding.org/xcode-code-coverage/

    http://ikennd.ac/blog/2013/10/xcode-bots-common-problems-and-workarounds/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-04
      • 2018-07-26
      • 2012-07-26
      • 2021-08-07
      • 1970-01-01
      • 2013-09-27
      • 2017-02-04
      相关资源
      最近更新 更多