Xcode 4.5命令行单元测试

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Xcode 4.5命令行单元测试相关的知识,希望对你有一定的参考价值。

自通过命令行运行单元测试时更新到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://stackoverflow.com/a/10823483/666943中概述的解决方案,但将ruby脚本转换为shell。最后,我基本上通过自制程序安装了ios-sim,并用以下内容替换了我的测试目标的Run Script中的Build Phases

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
另一答案

[我在Xcode 4.5 / iOS 6的Beta版中注意到了这个问题。我一直在研究独立的单元测试运行程序来解决此问题。它可以通过编译单元测试包,然后编译可以在模拟器环境中自动运行单元测试的应用程序版本来工作。

该工具绝不是完整的,但是似乎有足够的人遇到了这个问题,我现在就发布该工具。请分叉或评论,以便我改进此工具。

xcodetest:https://github.com/sgleadow/xcodetest

也请密切注意http://openradar.appspot.com/12306879问题

另一答案

xcodebuild -project ${PROJECT_PATH}/${PROJECT_NAME}.xcodeproj -scheme ${TEST_SCHEME} -configuration Debug -sdk iphonesimulator5.1 clean build TEST_AFTER_BUILD=YES

将iphonesimulator设置为5.1版似乎可以解决此问题。这个问题上有很多雷达漏洞。

本文还提到了一个很好的解决方案:

http://baolei.tumblr.com/post/32428168156/ios-unit-test-from-command-line-ios6-xcode4-5

另一答案

还有一点小技巧可以帮助在iOS6.0模拟器SDK上运行命令行测试

我正在使用Cedar,此调整帮助了我:

首先,您需要稍微更新main文件:

  // 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可以很好地运行,并带有一些运行时警告,但是至少它们可以运行:)

以上是关于Xcode 4.5命令行单元测试的主要内容,如果未能解决你的问题,请参考以下文章

单元测试目标不在Xcode 4.5上运行

使用命令行的 Xcode 4 单元测试

Xcode 命令行工具 (XCode 4.6) 从终端运行单元测试

由于 otest 错误,无法从命令行运行 Xcode 单元测试

在 iOS 开发中使用 OCUnit 对 XCode 4.5 中的核心数据对象进行单元测试

Xcode 4,断点在 Mac OS 命令行工具的单元测试中不起作用