我想知道当iOS应用程序在Xcode机器人上运行单元测试时如何生成gcda文件。
我使用this blog配置Xcode以生成测试覆盖率文件,并使用利用lcov的脚本生成报告。我可以在我的开发计算机上一致地创建覆盖文件和报告,但是当bot尝试相同的过程时,不会出现.gcda文件。在机器人上调用__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()
而不是其他内容。
正在搜索"个人资料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在我的方案中的Archive的后动作阶段被调用。我在我的开发mac上使用Xcode 5.0.2以及在CI服务器上使用Xcode服务。正在使用XCTest框架运行单元测试。
提前感谢您的帮助!
答案 0 :(得分:2)
好吧,看起来它确实是一个被怀疑的许可问题。我找到了使用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
除了成功生成覆盖文件外,我还将它们复制到另一个文件夹。我的测试覆盖率报告是在Archive的动作后阶段生成的,我找不到在该阶段访问这些文件的方法。原因是它们是在
中生成的 /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/