2009-11-06 69 views
17

我试图单元测试实例化字体一些iPhone的代码。我已经收窄,以下崩溃的单元测试:为什么实例在iphone单元测试UIFont导致崩溃?

#import "test.h" 
#import <UIKit/UIKit.h> 


@implementation test 

- (void)testFonts { 
    [UIFont systemFontOfSize:12]; 
} 

@end 

这崩溃与错误:

Test Case '-[test testFonts]' started. 
/Developer/Tools/RunPlatformUnitTests.include: line 415: 79768 Trace/BPT trap   "${THIN_TEST_RIG}" "${OTHER_TEST_FLAGS}" "${TEST_BUNDLE_PATH}" 
/Developer/Tools/RunPlatformUnitTests.include:451: error: Test rig '/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.sdk/Developer/usr/bin/otest' exited abnormally with code 133 (it may have crashed). 

好像有一些设置,我没有在我的单元测试的目标在做做这个工作。你如何测试实例化字体的东西?

+0

您应该提供控制台输出以更好地进行调试。但是,访问字体不需要额外的步骤,您的操作方式就好了。问题是:不包括/链接到正确版本的UIKit或代码中的其他地方。 – Till 2009-11-14 13:47:24

+0

也得到这个崩溃。任何尝试调用systemFontOfSize:完全破坏它。 /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.0.sdk/Developer/usr/bin/otest'以代码133异常退出(它可能已崩溃)。 – featherless 2010-05-31 06:23:56

+0

嘿,有什么我可以做的,使答案更完整/有帮助吗?如果没有...我可以有接受汉堡? – beOn 2012-03-22 20:44:17

回答

1

你有没有试过在设备上?我似乎记得你只能在设备上运行时在测试中包含UIKit的东西,而不是针对模拟器...

+0

仅当使用Google Toolbox for Mac时,UIKit的东西在单元测试中工作得很好。 http://code.google.com/p/google-toolbox-for-mac/wiki/iPhoneUnitTesting – dmaclach 2010-07-12 20:55:29

+1

我有同样的问题。它适用于设备和模拟器,但如果我在命令行中启动测试,则会崩溃。 – Quentin 2011-04-26 15:47:17

2

我看到3.2(和3.1.3)的确切问题。我在两台独立的机器上看到过它,所以我不认为我的SDK已损坏。

我创建了一个新的iPhone观点基于项目,并增加了一个单元测试,以及一个测试用例。

这被设置为逻辑测试。

控制台输出如下:

Test Case '-[TestTests testTests]' started. 
/Developer/Tools/RunPlatformUnitTests.include: line 415: 21141 Trace/BPT trap    "${THIN_TEST_RIG}" "${OTHER_TEST_FLAGS}" "${TEST_BUNDLE_PATH}" 
/Developer/Tools/RunPlatformUnitTests.include:451: error: Test rig '/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.3.sdk/Deve loper/usr/bin/otest' exited abnormally with code 133 (it may have crashed). 
Command /bin/sh failed with exit code 1 

如果我设置了用于调试的单元测试,然后我可以看到飞机坠毁,用下面的堆栈跟踪:

#0 0x00342d51 in __HALT 
#1 0x002947c7 in _CFRuntimeCreateInstance 
#2 0x00b8441e in GSFontCreateWithName 
#3 0x028c8f31 in +[UIFont systemFontOfSize:] 

我可以看到肯德尔点(UIKit的东西可能只在设备上工作),但似乎并没有被记录任何地方非常好。

9

这并不说明它非常好,但苹果的测试套件分割单元测试分为两个不同类别:

  • 逻辑测试

    这些测试将检查你的代码的正确 功能在 洁净室环境。

  • 应用测试

    这些测试将检查你的代码的功能 在运行的应用程序 。

似乎有很多UI相关代码无法在“逻辑测试”情况下运行。有关逻辑测试与应用测试的更多信息,请点击这里。

http://developer.apple.com/library/ios/#documentation/DeveloperTools/Conceptual/UnitTesting/01-Unit-Test_Overview/overview.html

+1

您提供的链接不存在。你是对的。 UIFont是UIKit的一部分,无法在单元测试中测试 – 2012-08-08 03:54:46

+0

链接对我有用 – 2013-07-16 16:46:33

19

我的一个朋友最近遇到了这一点,我挖出来的最后一个项目我成功地设置此上。诀窍是在应用程序测试中运行任何涉及UIFont的测试,而不是单元测试。这里有几件事情,以确保设置您的应用程序测试目标时:

  1. 构建阶段:把你的产品代码为您的测试目标由 包括你的主要目标为测试目标的 的一个依赖,而而不是将.m文件包含在您的测试 目标中。这仅仅是为了组织。
  2. 生成设置:确保您的测试目标的“捆绑装载机”设置 到$(BUILT_PRODUCTS_DIR)/Your Product Name.app/Your Product Name Again。注意,这是.../Product.app/Product - 也就是说,有 是在路径的最后一段没有的.app。如果你好奇, 看到你提到的文件,找到你打造的产品,适当 点击,选择查看包装内容,然后查找可执行文件。
  3. 生成设置:您的测试目标的“测试主机”应该设置为 $(BUNDLE_LOADER)。十分简单。
  4. 生成设置:测试目标的其他链接标志应包括 -framework SenTestingKit
  5. 生成设置:“测试版本后,”应该是第
  6. 计划:“构建”应该包括你的测试目标,以及你的主要目标 ,以“测试”在这两个目标中选择的唯一复选框。
  7. 计划:“测试”应该只包括你的测试目标。它包含的文件将自动添加到列表中。

...厚福。这将是足以让你一切会。并不是所有的文档都记录在一个地方,搞清楚如何让这两种测试运行需要花费更多的时间和痛苦,而不是我想承认的。

很奇怪的是,苹果似乎已经拉下自己的DOCO此事。我不知道是否有未来的另一个变化......

请打我,如果您有任何补充以上。这不是一个设置应用程序测试的完整指南,但以上是我遇到的未记录的绊脚石。 FMI,我强烈建议this CocoaWithLove article

+0

对于列表中的第二步:是否可以通过某种变量以某种方式推广“您的产品名称”?我问的原因是我们有一个单独的iphone和ipod应用程序共享相同的代码,但不共享设备特定的资源(图像和xib等)。每当我运行单元测试时,我必须选择一个方案并使用它,因为单元测试包只能以这种方式引用一个应用程序。我想使它具有通用性,以便在测试时可以选择任何一个。 $ {PRODUCT_NAME}不起作用,因为它引用了单元测试包本身,而不是应用包。 – Kevlar 2012-03-14 21:34:56

+0

嗯......好问题。让我确定我明白你在做什么......你想要一个可用于测试这两个应用的目标吗?我不知道这是否会奏效。您如何指出您希望测试目标测试哪个应用程序?令我困惑的是“我想使它成为通用的,这样我就可以在测试时选择其中一个”。哪一个是什么? (接下来的评论) – beOn 2012-03-22 20:28:56

+0

现在...如果你想有两个单独的测试方案,每个测试方案都会测试一个不同的应用程序,这并不难。我不知道如何为产品名称使用变量,但有两个目标,您可以在其各自的“生成设置”中使用不同的常量值。我就是这样做的。如果我完全误解了你(总是可能;)),请解释一下你之后的情况,我会尽力帮忙。 – beOn 2012-03-22 20:29:20

0

对不起,挖掘它,但我有XCT测试一些问题上的Xcode 5和它与这个主题相关的

报价:

“许多UIKit类不会无的UIApplication 工作尝试将代码添加到通过这一项目的测试结果表明,其他的测试将不得不从LogicTests有条件排除还有:

默认的loadView方法会失败 - 这样的testLoadView方法#ifdef'd出

任何分配/初始化UILabel的尝试都将失败。我不知道为什么,但正因为如此,标签上的所有测试必须#ifdef'd。

一般情况下,不要指望从UIKit框架事情在逻辑测试工作。其他框架几乎总是可以工作的(在这个应用程序中,CoreLocation和Foundation框架没有问题)。

在UIKit中,一些元素将工作 - 例如,一个UIWebView并没有在我的测试任何问题。在LogicTests包中(没有实际运行的应用程序),究竟哪些用户界面对象会失败,直到您尝试才会真正清楚,但这些失败是您仍然需要运行应用程序测试进行验证的原因 - 应用程序测试更具权威性导致在UIKit的东西“

网址:http://www.cocoawithlove.com/2009/12/sample-iphone-application-with-complete.html

0

中选择您的单元测试的目标。‘常规‘部分目标’,从项目/目标清单和第’,选择您的主机应用程序为主要应用,它有字体。

这就解决了我的问题。