我在Xcode 4中创建了一个全新的iOS项目,并包含了单元测试.默认应用程序有2个目标,主应用程序和单元测试包.使用"产品>测试"(Command-U)构建应用程序,构建单元测试包,启动iOS模拟器并运行测试.现在,我希望能够从命令行执行相同的操作.命令行工具(xcodebuild)没有"测试"操作,但似乎我应该能够直接构建单元测试包目标,因为它取决于应用程序本身.但是,运行:
xcodebuild -target TestAppTests -sdk iphonesimulator4.3 -configuration Debug build
Run Code Online (Sandbox Code Playgroud)
给出以下消息:
/Developer/Platforms/iPhoneSimulator.platform/Developer/Tools/Tools/RunPlatformUnitTests:95: warning: Skipping tests; the iPhoneSimulator platform does not currently support application-hosted tests (TEST_HOST set).
Run Code Online (Sandbox Code Playgroud)
这似乎是一个谎言,因为当我从GUI运行Command-U时,为我的单元测试包目标设置了测试主机.我之前看过有关逻辑测试和应用程序测试之间分离的帖子,但似乎Xcode 4消除了这种区别.我是如何从命令行运行测试的?
使用命令行工具执行目标并且iphone模拟器设置为硬件版本6.0(10A403)时,使用errSecNotAvailable调用Keychain服务失败.如果我将模拟器版本更改为其他先前版本(4.3,5.0,5.1)并使用相同的命令行脚本重新执行,则调用会成功.
我正在运行最新的XCode 4.5,并且从XCode中下载了命令行工具.
要重现此错误,请执行以下操作:
在XCode中执行OCUnit目标并查看iphone模拟器中设置的硬件版本的测试通过(只需在执行之间进行更改).
使用以下命令从命令行执行OCUnit目标:
xcodebuild -target TARGET_NAME_HERE -sdk iphonesimulator -configuration Release TEST_AFTER_BUILD=YES
Run Code Online (Sandbox Code Playgroud)
将iphone模拟器设置为硬件版本6.0,测试将失败.如果将iphone模拟器硬件版本更改为4.3,5.0或5.1并再次执行命令行脚本,则测试将成功.
这是一个命令行工具问题吗?一个iPhone模拟器的问题?从命令行问题运行的OCUnit目标?
谁喜欢只在彗星对齐时通过的单位测试?
有任何想法吗?
这是代码:
#define KEYCHAIN_ITEM_ATTRIBUTES (id)kSecClassGenericPassword, kSecClass, @"MyService", kSecAttrService, @"MyPassword", kSecAttrAccount
const NSString* MyPassword = @"blabla";
- (void)testExample
{
// remove previous keychain item
OSStatus status = SecItemDelete((CFTypeRef)[NSDictionary dictionaryWithObjectsAndKeys:KEYCHAIN_ITEM_ATTRIBUTES, nil]);
NSLog(@"SecItemDelete status:%ld",status);
NSParameterAssert(status == errSecSuccess || status == errSecItemNotFound);
// add keychain item with new value
NSData *data = [MyPassword dataUsingEncoding:NSUTF8StringEncoding];
status …Run Code Online (Sandbox Code Playgroud)