如何在Xcode 4的Cocoa Touch Unit测试包中创建应用程序测试?

时间:2011-04-09 23:37:44

标签: iphone cocoa-touch unit-testing

我用Cocoa Touch Unit Testing Bundle创建了一个Xcode 4项目。我能够成功创建和运行逻辑测试。但是,我不确定如何将测试创建为在iOS设备上运行并使用UIKit的应用程序测试。当我创建一个使用UIKit的测试并尝试在设备上的捆绑中运行测试时,Xcode 4弹出一个对话框说:

  

逻辑测试不可用

     

不支持iOS设备上的逻辑测试。您可以在模拟器上运行逻辑测试。

我尝试在模拟器上运行测试,但当然在进行UIKit调用时失败了。

有没有人知道如何使用Xcode 4和Cocoa Touch Unit Testing Bundle在iOS设备上创建和运行应用程序测试?

编辑:如果有帮助,这是测试代码:

@implementation TinyWordsTests

- (void)setUp
{
    [super setUp];
    CC_DIRECTOR_INIT();
}

- (void)tearDown
{
    CC_DIRECTOR_END();
    [super tearDown];
}

- (void)testExample
{
    CCScene *scene = [TWOHelloWorldLayer scene];
    STAssertNotNil(scene, @"Scene must not be nil.");
}

@end

以及在模拟器中运行测试时从gdb得到的堆栈跟踪:

(gdb) bt
#0  0x00464781 in __HALT ()
#1  0x003af8ed in _CFRuntimeCreateInstance ()
#2  0x00da81ea in GSFontCreateWithName ()
#3  0x038f55eb in UINewFont ()
#4  0x038f56bd in +[UIFont fontWithName:size:traits:] ()
#5  0x038f507d in +[UIFont fontWithName:size:] ()
#6  0x01a49205 in -[CCTexture2D(Text) initWithString:fontName:fontSize:] (self=0x197f9f0, _cmd=0xe10840, string=0x1a9c900, name=0x1a9c8f0, size=64) at CCTexture2D.m:487
#7  0x01a2d897 in -[CCLabelTTF setString:] (self=0x1981d70, _cmd=0x156e07, str=0x1a9c900) at CCLabelTTF.m:95
#8  0x01a2dc9d in -[CCLabelTTF initWithString:fontName:fontSize:] (self=0x1981d70, _cmd=0xe10840, str=0x1a9c900, name=0x1a9c8f0, size=64) at CCLabelTTF.m:79
#9  0x01a2da9a in +[CCLabelTTF labelWithString:fontName:fontSize:] (self=0x1a9b53c, _cmd=0xe0ddc0, string=0x1a9c900, name=0x1a9c8f0, size=64) at CCLabelTTF.m:53
#10 0x01a01b10 in -[TWOHelloWorldLayer init] (self=0x197ee40, _cmd=0x2c7c) at TWOHelloWorldLayer.m:39
#11 0x01a341bb in +[CCNode node] (self=0x1a99ee4, _cmd=0x3baad59) at CCNode.m:231
#12 0x01a01a80 in +[TWOHelloWorldLayer scene] (self=0x1a99ee4, _cmd=0xe00fa0) at TWOHelloWorldLayer.m:22
#13 0x01a5d430 in -[TinyWordsTests testExample] (self=0x197e490, _cmd=0xe59dd0) at TinyWordsTests.m:30
#14 0x00410c7d in __invoking___ ()
#15 0x00410b51 in -[NSInvocation invoke] ()
#16 0x201043d2 in -[SenTestCase invokeTest] ()
#17 0x20104aa7 in -[SenTestCase performTest:] ()
#18 0x201041d3 in -[SenTest run] ()
#19 0x20106eda in -[SenTestSuite performTest:] ()
#20 0x201041d3 in -[SenTest run] ()
#21 0x20106eda in -[SenTestSuite performTest:] ()
#22 0x201041d3 in -[SenTest run] ()
#23 0x201067a4 in +[SenTestProbe runTests:] ()
#24 0x000023c7 in ?? ()
#25 0x000025f2 in ?? ()
#26 0x0000209a in ?? ()
#27 0x00002049 in ?? ()

2 个答案:

答案 0 :(得分:8)

要使其正常工作,您需要转到测试包的构建设置,并将测试主机键设置为$(BUNDLE_LOADER)

此外,请确保在捆绑包的构建设置中将捆绑加载器键设置为$(BUILT_PRODUCTS_DIR)/yourAppName.app/yourAppName

答案 1 :(得分:2)

不幸的是,iOS上的测试是一个带有官方工具的大杂烩。有两种类型的单元测试。逻辑测试没有UI调用并在模拟器中运行。应用程序测试可以运行和操作UI,但只能在设备上运行。

听起来你已经编写了运行UI的逻辑测试。您想要的是创建应用程序测试并在设备上运行它。为此,您必须遵循http://developer.apple.com/library/ios/#documentation/Xcode/Conceptual/iphone_development/135-Unit_Testing_Applications/unit_testing_applications.html并创建一个独立的应用程序目标,以便在包含AppTest目标的设备上运行。

但是,除此之外,由于必须将测试和依赖项下的所有代码添加到每个目标和应用程序目标中,因此这一点非常繁琐。您还必须将逻辑测试放在应用程序测试目标中的逻辑测试目标和应用程序测试中。