关于xcode:如何运行和调试iPhone应用程序的单元测试

How to run and debug unit tests for an iPhone application

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

我花了相当长的时间,但我终于设法使它为我的项目工作。为了创建"逻辑"测试,我遵循了关于创建逻辑测试的苹果指南。一旦您了解逻辑测试是在构建期间运行的,这就可以很好地工作。

为了能够调试这些测试,需要创建一个调用这些测试的自定义可执行文件。SeanMiceli在GrokkingCocoa博客上的文章提供了所有信息。然而,紧随其后并没有立即取得成功,需要进行一些调整。

我将回顾肖恩的教程中介绍的主要步骤,其中提供了一些"针对假人"的大纲,我花了一些时间来了解:

  • 设置包含单元测试但不运行它们的目标
  • 设置otest可执行文件以运行测试
  • 设置otest环境变量,以便otest可以找到单元测试
  • 使用xcode 3.2.5执行以下操作

    xcode 4的注释

    在Xcode4中,可以直接调试单元测试。只需编写测试,将其作为测试之一添加到目标中,并在其中设置断点。这就是全部。更多的人会来。

    步骤1-设置目标

  • 复制位于项目目标下的单元测试目标。这还将创建单元测试产品(.octest文件)的副本。在下图中,"Logictest"是原始目标。
  • 将单元测试目标和单元测试产品(.octest文件)重命名为相同的名称。在下图中,"logictestsdebug"是重复的目标。
  • 删除新目标的runscript阶段
  • 两者的名称可以是任何东西,但我会避免空格。

    enter image description here

    步骤2-设置otest

    这里最重要的一点是获得正确的otest,即当前iOS的otest,而不是默认的Mac版本。这在肖恩的教程中有很好的描述。以下是帮助我纠正问题的更多细节:

  • 转到项目->新建自定义可执行文件。这将弹出一个窗口,提示您输入可执行文件名和可执行路径。
  • 键入您想要的名称。
  • 复制粘贴到iOS otest可执行文件的路径。在我的例子中,这是/developer/platforms/iphoneSimulator.platform/developer/sdks/iphoneSimulator4.2.sdk/developer/usr/bin/otest
  • 按回车键。这将使您进入可执行文件的配置页面。
  • 此时唯一要更改的是选择"路径类型:相对于当前的SDK"。不要键入路径,这是在步骤3中完成的。enter image description here
  • 步骤3-设置otest参数和环境变量

    otest参数的设置很简单…但事实证明这是我最大的问题。我最初将逻辑测试目标命名为"LogictestsDebug"。使用这个名称和"logictests debug.octest"(带引号)作为otest的参数,我一直让otest以退出代码1终止,从不停止进入我的代码中…

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

    Otest的论点是:

  • -Sentest self(或全部或一个测试名称-在终端中键入man otest以获取列表)
  • logictestsdebug.octest-其中logictestsdebug需要用逻辑测试包名称替换。
  • 以下是用于复制/粘贴的环境变量列表:

    • Dyld_根路径:$sdkroot
    • Dyld_框架_路径:"$构建_产品_目录:$sdk_根目录:$Dyld_框架_路径"
    • iphone模拟器根:$sdkroot
    • cffixed_用户主页:"$主页/库/应用程序支持/iPhone模拟器/用户"
    • Dyld_库_路径:$构建_产品_目录:$Dyld_库_路径
    • Dyd_新_本地_共享_区域:是
    • Dyld_no_fix_prebinding:是

    请注意,我还尝试了Dyd_force_flat_名称空间,但这只会导致otest崩溃。

    enter image description here

    步骤4-运行Otest可执行文件

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

  • 将活动目标设置为单元测试目标(在我的例子中是logictestsdebug)
  • 将活动可执行文件设置为OTest可执行文件
  • 您可以构建和运行可执行文件,并使用断点调试测试。

    作为补充说明,如果在运行otest可执行文件时遇到问题,它可能与以下内容有关:

  • 故障路径。最初我有很多问题,因为我指向的是mac-otest。我在发射时一直崩溃,终止代码是6。
  • 错误的论点。在我从bundle(.octest)名称中删除空间之前,我一直有Otest崩溃,退出代码为1。
  • 环境变量中的路径错误。肖恩教程有很多后续问题,让人们对其他人的尝试有所了解。集合i


    这篇文章的本意是"如何"而不是一个真正的问题。因此,这个答案只是让我把"如何"标记为"已回答"。这可能会被社区标记为不规则。我正在征求关于在哪里张贴未来"如何做"文章的建议。

    不过,关于这个主题还有最后一点要注意。对于那些仍然怀疑编写单元测试是否值得的人,我肯定会说是的!

    我目前正在编写一个具有coredata和从Web服务检索数据(XML解析)的应用程序。整个模型可以测试和调试,而无需:

  • 在模拟器或设备上运行实际应用程序。不必使用设备来运行测试是一个巨大的时间增益。这是每次跑步2分钟到5秒之间的差异。
  • 在测试模型时不需要创建视图或控制器。完整的开发和测试只能在第一次迭代中集中在模型上。一旦模型被清除为集成,其余的开发就可以遵循。
  • 为了调试XML解析,我可以简单地使用我完全控制的"硬编码"文件。

    当然,关键是在代码中实现特性时编写测试。就整个应用程序的调试而言,这确实是一个省时的方法。

    好的,我就到此为止。


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

  • 产品>构建用于>测试
  • 在要调试的部分测试中放置断点
  • 产品>测试
  • 这是Xcode6.0.1上的代码,似乎比上面描述的长过程更方便。