如何运行和debuggingiPhone应用程序的unit testing

注:unit testing现在更容易设置。 本教程与Xcode版本5及以上版本无关。

我花了相当一段时间,但终于成功地为我的项目工作。 为了创build“逻辑”testing,我遵循了关于创build逻辑testing的Apple指导原则 。 一旦你明白逻辑testing是在构build过程中运行的,这个工作正常。

为了能够debugging这些testing,需要创build一个自定义可执行文件来调用这些testing。 Sean Miceli在Grokking Cocoa博客上的文章提供了所有这些信息。 然而,之后并没有立竿见影的成功,需要一些调整。

我将详细介绍Sean教程中的主要步骤,提供一些“傻瓜”轮廓,这些轮廓花了我一些时间来弄清楚:

  1. 设置一个包含unit testing但不运行它们的目标
  2. 安装可执行文件以运行testing
  3. 设置最简单的环境variables,以便可以find你的unit testing

以下是使用XCode 3.2.5进行的

注意XCode 4

在XCode 4中,可以直接debugging你的unit testing。 只需编写testing,将其作为testing之一添加到目标中,并在其中设置断点。 就这样。 更多将会来。

步骤1 – 设置目标

  1. 复制您的项目目标下的unit testing目标。 这也将创buildunit testing产品(.octest文件)的副本。 在下图中,“LogicTest”是原始目标。
  2. 将unit testing目标和unit testing产品(.octest文件)重命名为相同的名称。 在下图中“LogicTestsDebug”是重复的目标。
  3. 删除新目标的RunScript阶段

两者的名称可以是任何东西,但我会避免空格。

在这里输入图像说明

第2步 – 设置otest

这里最重要的一点是要得到正确的,也就是说你的iOS版本,而不是默认的Mac版本。 这在肖恩的教程中有很好的描述。 以下是一些帮助我设置正确的更多细节:

  1. 转到项目 – >新的自定义可执行文件。 这将popup一个窗口,提示您input一个可执行文件名称和一个可执行文件path。
  2. input任何你想要的名字。
  3. 复制粘贴path到您的iOS otest可执行文件。 在我的情况下这是/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.2.sdk/Developer/usr/bin/testing
  4. 按回车。 这会将您带到可执行文件的configuration页面。
  5. 现在唯一要改变的是select“pathtypes:相对于当前的SDK”。 不要inputpath,这是在第3步完成的。 在这里输入图像说明

第3步 – build立最简单的参数和环境variables

最简单的论点是设置…但这被certificate是我最大的问题。 我最初命名我的逻辑testing目标“LogicTestsdebugging”。 用这个名字和“LogicTests Debug.octest”(带引号)作为参数,我一直用退出代码1终止,永远不要停止进入我的代码…

解决scheme :您的目标名称中没有空格!

otest的论据是:

  1. -SenTest Self(或全部或testing名称 – 在terminal中键入人名以获取列表)
  2. {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,您需要:

  1. 将你的活动目标设置为你的unit testing目标(LogicTestsDebug在我的情况下)
  2. 将您的活动可执行文件设置为您的可执行文件

您可以构build并运行您的可执行文件并使用断点debugging您的testing。

作为一个方面说明,如果您在运行可执行文件时遇到问题,可能与以下方面有关:

  1. 错误的path。 最初我有很多问题,因为我指的是最简单的问题。 我在终止代码6发射时一直崩溃。
  2. 错误的参数。 直到我从包(.octest)名称中删除空间,我一直保持崩溃退出代码1。
  3. 环境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,而不必:

  1. 在模拟器或设备上运行实际的应用程序。 不必使用设备来运行testing是一个巨大的时间。 这是每次运行2分钟和5秒之差。
  2. 而无需在testing模型时创build视图或控制器。 只有在第一次迭代中,完整的开发和testing才能关注模型。 一旦该模型被清除以进行整合,其余的开发可以遵循。

要debuggingXMLparsing,我可以简单地使用我完全控制的“硬编码”文件。

关键在于在代码中实现function时编写testing。 在整个应用程序的debugging方面,确实节省了时间。

Voilà,我会放在那。

我能够通过以下简单的步骤在debugging器中运行testing用例:

  1. 产品>构build>testing
  2. 在你想debugging的部分testing中放置一个断点
  3. 产品>testing

这是在Xcode 6.0.1上,似乎比上面描述的长程序更方便。