如何使用 Xcode 4 在 Cocoa Touch 单元测试包中创建应用程序测试?

Posted

技术标签:

【中文标题】如何使用 Xcode 4 在 Cocoa Touch 单元测试包中创建应用程序测试?【英文标题】:How do I create application tests in a Cocoa Touch Unit Testing Bundle with Xcode 4? 【发布时间】:2011-04-09 23:37:44 【问题描述】:

我创建了一个带有 Cocoa Touch 单元测试包的 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 ?? ()

【问题讨论】:

正确的方法放在这里:How to implement application unit test in Xcode 4 by hands 【参考方案1】:

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

此外,确保 Bundle Loader 键在 bundle 的构建设置中也设置为 $(BUILT_PRODUCTS_DIR)/yourAppName.app/yourAppName

【讨论】:

谢谢。还要在构建阶段为您的应用添加“目标依赖项”,否则它将不存在【参考方案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 目标的设备上运行。

但是,顺便说一句,这变得相当乏味,因为您必须将所有被测代码和依赖项添加到每个目标和应用程序目标中。您还必须只将逻辑测试放在逻辑测试目标中,并将应用程序测试放在应用程序测试目标中。

【讨论】:

感谢您的帮助。我不确定 Xcode 4 是否有新的指令,所以我还没有遵循 Xcode 3 的指令。一旦我弄清楚了 Xcode 4 在说明中做所有事情的方式,它就像一个魅力。

以上是关于如何使用 Xcode 4 在 Cocoa Touch 单元测试包中创建应用程序测试?的主要内容,如果未能解决你的问题,请参考以下文章

Cocoa xcode 4.3 全局变量

找不到 Cocoa 静态库的输出 .a(在 xcode 4 中)

Cocoa Xcode:使用 Swift 4 for Mac 以编程方式从 AppDelegate 打开窗口控制器?

Objective-C/Cocoa/XCode 新手:如何接收通知?

Cocoa (Xcode 4),从另一个 NIB 更改一个 NIB 上的标签

Xcode Cocoa 如何获取 GUI 组件