如何运行和debuggingiPhone应用程序的unit testing
注:unit testing现在更容易设置。 本教程与Xcode版本5及以上版本无关。
我花了相当一段时间,但终于成功地为我的项目工作。 为了创build“逻辑”testing,我遵循了关于创build逻辑testing的Apple指导原则 。 一旦你明白逻辑testing是在构build过程中运行的,这个工作正常。
为了能够debugging这些testing,需要创build一个自定义可执行文件来调用这些testing。 Sean Miceli在Grokking Cocoa博客上的文章提供了所有这些信息。 然而,之后并没有立竿见影的成功,需要一些调整。
我将详细介绍Sean教程中的主要步骤,提供一些“傻瓜”轮廓,这些轮廓花了我一些时间来弄清楚:
- 设置一个包含unit testing但不运行它们的目标
- 安装可执行文件以运行testing
- 设置最简单的环境variables,以便可以find你的unit testing
以下是使用XCode 3.2.5进行的
注意XCode 4
在XCode 4中,可以直接debugging你的unit testing。 只需编写testing,将其作为testing之一添加到目标中,并在其中设置断点。 就这样。 更多将会来。
步骤1 – 设置目标
- 复制您的项目目标下的unit testing目标。 这也将创buildunit testing产品(.octest文件)的副本。 在下图中,“LogicTest”是原始目标。
- 将unit testing目标和unit testing产品(.octest文件)重命名为相同的名称。 在下图中“LogicTestsDebug”是重复的目标。
- 删除新目标的RunScript阶段
两者的名称可以是任何东西,但我会避免空格。
第2步 – 设置otest
这里最重要的一点是要得到正确的,也就是说你的iOS版本,而不是默认的Mac版本。 这在肖恩的教程中有很好的描述。 以下是一些帮助我设置正确的更多细节:
- 转到项目 – >新的自定义可执行文件。 这将popup一个窗口,提示您input一个可执行文件名称和一个可执行文件path。
- input任何你想要的名字。
- 复制粘贴path到您的iOS otest可执行文件。 在我的情况下这是/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.2.sdk/Developer/usr/bin/testing
- 按回车。 这会将您带到可执行文件的configuration页面。
- 现在唯一要改变的是select“pathtypes:相对于当前的SDK”。 不要inputpath,这是在第3步完成的。
第3步 – build立最简单的参数和环境variables
最简单的论点是设置…但这被certificate是我最大的问题。 我最初命名我的逻辑testing目标“LogicTestsdebugging”。 用这个名字和“LogicTests Debug.octest”(带引号)作为参数,我一直用退出代码1终止,永远不要停止进入我的代码…
解决scheme :您的目标名称中没有空格!
otest的论据是:
- -SenTest Self(或全部或testing名称 – 在terminal中键入人名以获取列表)
- {LogicTestsDebug} .octest – 其中{LogicTestsDebug}需要被您的逻辑testing包名称replace。
以下是复制/粘贴的环境variables列表:
- DYLD_ROOT_PATH:$ SDKROOT
- DYLD_FRAMEWORK_PATH:“$ {BUILD_PRODUCTS_DIR}:$ {SDK_ROOT}:$ {DYLD_FRAMEWORK_PATH}”
- IPHONE_SIMULATOR_ROOT:$ SDKROOT
- CFFIXED_USER_HOME:“$ {HOME} /库/应用程序支持/ iPhone模拟器/用户”
- DYLD_LIBRARY_PATH:$ {BUILD_PRODUCTS_DIR}:$ {DYLD_LIBRARY_PATH}
- DYLD_NEW_LOCAL_SHARED_REGIONS:是
- DYLD_NO_FIX_PREBINDING:YES
请注意,我也尝试了DYLD_FORCE_FLAT_NAMESPACE,但是这只是简单的崩溃。
第4步 – 运行你的可执行文件
要运行您的可执行文件并开始debugging您的testing,您需要:
- 将你的活动目标设置为你的unit testing目标(LogicTestsDebug在我的情况下)
- 将您的活动可执行文件设置为您的可执行文件
您可以构build并运行您的可执行文件并使用断点debugging您的testing。
作为一个方面说明,如果您在运行可执行文件时遇到问题,可能与以下方面有关:
- 错误的path。 最初我有很多问题,因为我指的是最简单的问题。 我在终止代码6发射时一直崩溃。
- 错误的参数。 直到我从包(.octest)名称中删除空间,我一直保持崩溃退出代码1。
- 环境variables中的错误path。 肖恩教程有很多后续问题,让人对其他人的尝试有所了解。 我现在的套装似乎工作,所以我build议你从这开始。
您可能会在控制台中收到一些消息,可能会导致您认为环境variables有问题。 您可能会注意到有关CFPreferences的消息。 这个消息并不妨碍testing正常运行,所以如果你在运行时遇到问题,请不要关注它。
最后,一切正常,你将能够停止在你的testing中的断点。
最后一件事…
我在很多博客上看到,集成XCode SenTestKit的主要限制是在构build应用程序时无法运行testing。 事实certificate,这实际上很容易pipe理。 您只需将您的逻辑testing包作为依赖添加到您的应用程序项目中即可。 这将确保您的逻辑testing包已经build好,即所有的testing都在您的应用程序构build之前运行。
要做到这一点,你可以拖放你的逻辑testing包到你的应用程序目标上。
这篇文章的目的不仅仅是一个真正的问题。 因此,这个答案只是为了让我把“如何做”标记为“回答”。 这可能会被社区标记为不规范。 我想知道将来何处发布“How-to”文章的build议。
关于这个话题最后还是要注意的。 对于那些还在怀疑编写unit testing是否值得的人,我肯定会说“是”!
我目前正在用CoreData编写应用程序,并从Web服务中检索数据(xmlparsing)。 完整的模型可以被testing和debugging,而不必:
- 在模拟器或设备上运行实际的应用程序。 不必使用设备来运行testing是一个巨大的时间。 这是每次运行2分钟和5秒之差。
- 而无需在testing模型时创build视图或控制器。 只有在第一次迭代中,完整的开发和testing才能关注模型。 一旦该模型被清除以进行整合,其余的开发可以遵循。
要debuggingXMLparsing,我可以简单地使用我完全控制的“硬编码”文件。
关键在于在代码中实现function时编写testing。 在整个应用程序的debugging方面,确实节省了时间。
Voilà,我会放在那。
我能够通过以下简单的步骤在debugging器中运行testing用例:
- 产品>构build>testing
- 在你想debugging的部分testing中放置一个断点
- 产品>testing
这是在Xcode 6.0.1上,似乎比上面描述的长程序更方便。