【问题标题】:How to run and debug unit tests for an iPhone application如何为 iPhone 应用程序运行和调试单元测试
【发布时间】:2011-02-14 07:13:48
【问题描述】:

注意:现在设置单元测试要容易得多。本教程与 Xcode 5 及更高版本无关。

我花了相当长的时间,但我终于设法使它适用于我的项目。 为了创建“逻辑”测试,我遵循Apple guidelines on creating logic tests。 一旦您了解逻辑测试是在构建期间运行的,这就可以正常工作。

为了能够调试这些测试,需要创建一个自定义可执行文件来调用这些测试。 Sean Miceli on the Grokking Cocoa blog 的文章提供了执行此操作的所有信息。然而,遵循它并没有立即取得成功,需要进行一些调整。

我将回顾 Sean 教程中介绍的主要步骤,提供了一些“傻瓜”大纲,我花了一些时间才弄清楚:

  1. 设置一个包含单元测试但不运行它们的目标
  2. 设置 otest 可执行文件以运行测试
  3. 设置 otest 环境变量,以便 otest 可以找到您的单元测试

以下是使用 XCode 3.2.5

执行的

XCode 4 的注意事项

在 XCode 4 中,可以直接调试单元测试。只需编写您的测试,将其作为测试之一添加到您的目标并在其中设置断点。就这样。还会有更多。

第 1 步 - 设置目标

  1. 复制位于项目 Targets 下的单元测试目标。这还将创建单元测试产品的副本(.octest 文件)。下图中“LogicTest”就是原来的目标。
  2. 将单元测试目标和单元测试产品(.octest 文件)重命名为相同的名称。下图中“LogicTestsDebug”是重复的目标。
  3. 删除新目标的 RunScript 阶段

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

第 2 步 - 设置 otest

这里最重要的一点是获取正确的 otest,即适用于您当前 iOS 的那个,而不是默认的 Mac 版本。这在 Sean 的教程中有很好的描述。以下是一些帮助我正确设置的更多细节:

  1. 转到项目->新建自定义可执行文件。这将弹出一个窗口,提示您输入可执行文件名称和可执行文件路径。
  2. 输入任何您想要的名称。
  3. 将路径复制粘贴到您的 iOS otest 可执行文件。就我而言,这是 /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.2.sdk/Developer/usr/bin/otest
  4. 按回车键。这会将您带到可执行文件的配置页面。
  5. 此时唯一需要更改的是选择“路径类型:相对于当前 SDK”。不要输入路径,这是在步骤 3 中完成的。

第 3 步 - 设置 otest 参数和环境变量

最常见的参数设置起来很简单......但这被证明是我最大的问题。我最初将我的逻辑测试目标命名为“LogicTests Debug”。使用这个名称和“LogicTests Debug.octest”(带引号)作为 otest 的参数,我一直让 otest 以退出代码 1 终止并且永远不会停止到我的代码中......

解决方案:目标名称中不要有空格!

otest 的参数是:

  1. -SenTest Self(或 All 或测试名称 - 在终端中键入 man otest 以获取列表)
  2. {LogicTestsDebug}.octest - 其中 {LogicTestsDebug} 需要替换为您的逻辑测试包名称。

这里是复制/粘贴的环境变量列表:

  • DYLD_ROOT_PATH: $SDKROOT
  • DYLD_FRAMEWORK_PATH: "${BUILD_PRODUCTS_DIR}: ${SDK_ROOT}:${DYLD_FRAMEWORK_PATH}"
  • IPHONE_SIMULATOR_ROOT:$SDKROOT
  • CFFIXED_USER_HOME: "${HOME}/Library/Application Support/iPhone Simulator/User"
  • DYLD_LIBRARY_PATH:${BUILD_PRODUCTS_DIR}:${DYLD_LIBRARY_PATH}
  • DYLD_NEW_LOCAL_SHARED_REGIONS:是
  • DYLD_NO_FIX_PREBINDING:是

请注意,我也尝试了 DYLD_FORCE_FLAT_NAMESPACE 但这只会导致 otest 崩溃。

第 4 步 - 运行您的 otest 可执行文件

要运行您的 otest 可执行文件并开始调试您的测试,您需要:

  1. 将活动目标设置为单元测试目标(在我的例子中为 LogicTestsDebug)
  2. 将您的活动可执行文件设置为您的 otest 可执行文件

您可以构建和运行您的可执行文件并使用断点调试您的测试。

附带说明,如果您在运行 otest 可执行文件时遇到问题,可能与以下问题有关:

  1. 路径错误。最初我遇到了很多问题,因为我指向的是 mac otest。我在启动时不断崩溃,终止代码为 6。
  2. 参数错误。直到我从包 (.octest) 名称中删除空格之前,我一直在退出代码为 1 的 otest 崩溃。
  3. 环境变量中的路径错误。肖恩教程有很多后续问题,可以让您深入了解其他人的尝试。我现在的套装似乎可以工作,所以我建议你从这个开始。

您可能会在控制台中收到一些消息,这可能会导致您认为环境变量有问题。您可能会注意到有关 CFPreferences 的消息。此消息不会阻止测试正常运行,因此如果您在运行 otest 时遇到问题,请不要关注它。

最后,一旦一切正常,您将能够在测试中的断点处停止。

最后一件事......

我在许多博客上读到集成 XCode SenTestKit 的主要限制是在构建应用程序时无法运行测试。事实证明,这实际上很容易管理。您只需将 Logic 测试包作为依赖项添加到您的应用程序项目中。这将确保构建您的逻辑测试包,即在构建您的应用程序之前运行所有测试。

为此,您可以将逻辑测试包拖放到应用程序目标上。

【问题讨论】:

  • 提到的数字在哪里?
  • 由于权限低,我无法包含它们...
  • 感谢您为撰写指南文章所做的努力,但您能否也发布一个答案并相应地标记它?否则这篇文章将永远停留在“未回答的问题”列表的顶部。唯一的出路是结束这个问题,这似乎不符合你的好意。
  • @adrian。写了一个答案,问题结束了
  • 您能否提及本指南适用的 Xcode 版本?我看起来像 3.x,对吧? Xcode 4 好运吗?您还应该添加 [ios] 标签。

标签: iphone xcode ios unit-testing ocunit


【解决方案1】:

这篇文章的目的是作为一个“操作方法”,而不是一个真正的问题。因此,这个答案只是为了让我将“操作方法”标记为“已回答”。这可能会被社区标记为不正常。我愿意就在哪里发布未来的“操作指南”文章提出建议。

关于这个主题的最后一点。 对于那些仍然想知道编写单元测试是否值得的人,我肯定会说是!

我目前正在使用 CoreData 编写一个应用程序,并从 Web 服务中检索数据(xml 解析)。无需执行以下操作即可测试和调试完整的模型:

  1. 在模拟器或设备上运行实际应用程序。不必使用设备来运行测试是一个巨大的时间收益。这是每次跑步 2 分钟和 5 秒之间的差异。
  2. 在测试模型时无需创建视图或控制器。完整的开发和测试只能在第一次迭代中专注于模型。一旦模型被清除以进行集成,就可以进行其余的开发。

要调试 xml 解析,我可以简单地使用我完全控制的“硬编码”文件。

关键当然是在代码中实现功能时编写测试。就整个应用程序的调试而言,这确实可以节省时间。

Voilà,我就这样吧。

【讨论】:

  • 再次感谢您的操作方法。 StackOverflow 是发布此类文章的好地方。我只是建议提出一个问题(在这种情况下是“我如何为 iPhone 应用程序运行和调试单元测试?”),然后编写操作指南文章作为您自己问题的答案。我知道您只能在 48 小时后将其标记为答案,但这似乎是发布操作指南并遵守 SO 规则的最佳方式......再次抱歉批评您的帖子,我知道您只是在尝试提供帮助。
  • @Adrian。那是个很好的观点。我将在以后的 How-To 中以这种方式处理它。不要后悔,虽然我还在学习。所以感谢 cmets。
  • 您对应用程序测试有什么建议吗?如果使用“测试”方案运行,应用程序测试在模拟器中失败,如果在设备上使用“运行”方案运行,它们不会在断点处停止。根据developer.apple.com/library/ios/#documentation/Xcode/Conceptual/…“因为应用测试只在设备上运行,所以你也可以使用这些测试来进行硬件测试,比如获取设备的位置。”
  • 没关系。我一定是在测试时做错了什么。正如你的文章提到的,我可以正常调试。
【解决方案2】:

我能够通过以下简单步骤在调试器中运行测试用例:

  1. 产品 > 构建 > 测试
  2. 在要调试的部分测试中设置断点
  3. 产品 > 测试

这是在 Xcode 6.0.1 上,看起来比上面描述的冗长过程要方便得多。

【讨论】:

    猜你喜欢
    • 2011-04-23
    • 2014-09-16
    • 2017-04-28
    • 1970-01-01
    • 2018-02-20
    • 2016-03-23
    • 2011-12-22
    • 1970-01-01
    • 2015-10-06
    相关资源
    最近更新 更多