Xcode 4.5命令行单元测试

36

自从更新到Xcode 4.5后,通过命令行运行单元测试时遇到问题。当我尝试运行我的测试时,我看到以下输出:

Unknown Device Type. Using UIUserInterfaceIdiomPad based on screen size
Terminating since there is no workspace.
/Applications/Xcode.app/Contents/Developer/Tools/RunPlatformUnitTests.include:334: note: Passed tests for architecture 'i386' (GC OFF)

/Applications/Xcode.app/Contents/Developer/Tools/RunPlatformUnitTests.include:345: note: Completed tests for architectures 'i386'

虽然测试结果显示已通过且完成,但我认为它们实际上并没有运行。

我正在使用以下命令运行测试:

xcodebuild -workspace MyApp.xcworkspace -scheme MyAppTests -sdk iphonesimulator -configuration Debug clean build TEST_AFTER_BUILD=YES

有人遇到过同样的问题并可以提供解决方案吗?


我也遇到了同样的问题,其他人也一样:https://github.com/gabriel/gh-unit/issues/96。目前还没有解决方案。 - Jean Regisser
1
我能确认相同的问题。自从第一个测试版以来就存在这个问题,但因为它是“不支持的功能”,所以苹果没有提供帮助。我的解决方案是编写一个单独的OCUnit/SenTest测试运行器,使用WaxSim启动。它已经部分完成,并且目前正在运作中,完成后会分享出来。 - Stew
有关Xcode 4.5.1的任何消息吗?请注意,我在一个重复的问题上设置了赏金:https://dev59.com/t2cs5IYBdhLWcg3wwmnA - fabb
有没有不需要安装额外软件的解决方案?我真的很希望能找到一种解决方案,让我能够修复我的当前安装,这样我就不必更改我的构建服务器。 - groomsy
Xcode 5支持其自己的持续集成解决方案。也许这也可以通过其他CI工具(如Jenkins)访问?https://developer.apple.com/library/prerelease/ios/documentation/IDEs/Conceptual/xcode_guide-continuous_integration/000-About_Continuous_Integration/about_continuous_integration.html - fabb
显示剩余2条评论
4个回答

29

我觉得我也应该分享一下我为解决这个问题所做的事情。我遵循了在https://dev59.com/Wm035IYBdhLWcg3weP3f#10823483中概述的解决方案,但将ruby脚本转换为了shell。最后,我通过homebrew安装了ios-sim,并将我的测试目标的Build Phases中的Run Script替换为以下内容:

if [ "$RUN_UNIT_TEST_WITH_IOS_SIM" = "YES" ]; then
    test_bundle_path="$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.$WRAPPER_EXTENSION"
    ios-sim launch "$(dirname "$TEST_HOST")" --setenv DYLD_INSERT_LIBRARIES=/../../Library/PrivateFrameworks/IDEBundleInjection.framework/IDEBundleInjection --setenv XCInjectBundle="$test_bundle_path" --setenv XCInjectBundleInto="$TEST_HOST" --args -SenTest All "$test_bundle_path"
    echo "Finished running tests with ios-sim"
else
    "${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests"
fi

为了立即开始测试,我传入参数RUN_UNIT_TEST_WITH_IOS_SIM=YES,例如:

xcodebuild -workspace MyApp.xcworkspace -scheme MyAppTests -sdk iphonesimulator -configuration Debug clean build RUN_UNIT_TEST_WITH_IOS_SIM=YES

3
我经常收到以下错误提示:[DEBUG] 无法启动会话:Error Domain=DTiPhoneSimulatorErrorDomain Code=2 "模拟器会话超时。" UserInfo=0x7fd323c2a4a0 {NSLocalizedDescription=模拟器会话超时。} - fabb
1
不,我现在尝试了没有使用Jenkins的方法。我通过运行测试方案从Xcode中运行它(我也会尝试从命令行运行,也许错误就来自那里)。并且:我有一个单独的Jenkins服务器和构建节点。在大多数情况下,构建节点上的“jenkins”用户*未登录。服务器只是通过SSH连接到它。在Xcode 4.4.1中,使用此hack可以正常工作:http://www.raingrove.com/2012/03/28/running-ocunit-and-specta-tests-from-command-line.html - fabb
好的,抱歉。使用您提供的命令行运行时可以正常工作(附加“-arch i386”)。现在我需要尝试在Jenkins上运行它。 - fabb
好的,我需要更正我的评论:自从我重新启动系统以来它一直工作正常,现在我得到了与@fabb相同的错误。 - plaetzchen
@fabb 你在使用 iOS 模拟器时是否运行了 xcodebuild?我也遇到了这种情况下的会话超时错误。 - Hlung
显示剩余8条评论

9
我注意到这个问题出现在Xcode 4.5 / iOS 6的beta版本中。我一直在研究一个独立的单元测试运行器来解决这个问题。它的工作原理是编译你的单元测试包,然后编译一个自动在模拟器环境中运行单元测试的应用程序版本。
这个工具还不完善,但是有足够多的人遇到了这个问题,所以我现在将该工具发布为原样。请fork或评论以便我改进该工具。
xcodetest: https://github.com/sgleadow/xcodetest 同时,请关注这个问题的radar:http://openradar.appspot.com/12306879

我可以确认,Stew的答案帮助我成功运行了单元测试。 - Jessedc
无法正常工作的是在同一方案中的库子项目中执行其他测试。 - fabb
小问题:当多个用户使用脚本时,它只对第一个用户有效,因为其他用户无法访问“/tmp/xcodetest/${MAIN_APP_TARGET}”目录。这应该被设置为唯一的。 - fabb
我使用 OUTPUT_DIR=\mktemp -d -t "xcodetest"`/${MAIN_APP_TARGET}`。 - fabb
有时候我也会遇到这种情况。会话以错误结束,模拟应用程序退出了。但是测试仍然通过了。 - kkurni
显示剩余3条评论

6

1
我最终采用了与您提供的链接类似的解决方案,该方案基于答案https://dev59.com/Wm035IYBdhLWcg3weP3f#10823483。 - Edward Huynh
我猜你仍然需要像这里描述的那样修补 RunPlatformUnitTests?http://www.raingrove.com/2012/03/28/running-ocunit-and-specta-tests-from-command-line.html - fabb
是的,还需要修补RunPlatformUnitTests。我这里有一个示例:https://github.com/victorlima/AutoBuild/blob/master/scripts/RunPlatformUnitTests.patched。如果可以,请告诉我。 - Victor Lima

2

还有一些小技巧可以帮助在iOS6.0模拟器SDK上运行命令行测试。我正在使用Cedar并且这个调整对我很有帮助:

首先,你需要稍微更新一下你的主文件

  // Faking up that workspace port
  CFMessagePortCreateLocal(NULL, (CFStringRef) @"PurpleWorkspacePort", NULL, NULL,NULL);
  return UIApplicationMain(argc, argv, nil, @"CedarApplicationDelegate");

其次,您需要将类别添加到UIWindow:

@implementation UIWindow (Private)
- (void)_createContext {
   // Doing nothing here. Just for crash avoidance
}
@end

Cedar Unittest 可以正常运行,但是可能会有一些运行时警告,不过至少可以运行 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接