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阶段
两者的名称可以是任何东西,但我会避免空格。
步骤2-设置otest
这里最重要的一点是获得正确的otest,即当前iOS的otest,而不是默认的Mac版本。这在肖恩的教程中有很好的描述。以下是帮助我纠正问题的更多细节:
转到项目->新建自定义可执行文件。这将弹出一个窗口,提示您输入可执行文件名和可执行路径。
键入您想要的名称。
复制粘贴到iOS otest可执行文件的路径。在我的例子中,这是/developer/platforms/iphoneSimulator.platform/developer/sdks/iphoneSimulator4.2.sdk/developer/usr/bin/otest
按回车键。这将使您进入可执行文件的配置页面。
此时唯一要更改的是选择"路径类型:相对于当前的SDK"。不要键入路径,这是在步骤3中完成的。
步骤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崩溃。
步骤4-运行Otest可执行文件
要运行otest可执行文件并开始调试测试,需要:
将活动目标设置为单元测试目标(在我的例子中是logictestsdebug)
将活动可执行文件设置为OTest可执行文件
您可以构建和运行可执行文件,并使用断点调试测试。
作为补充说明,如果在运行otest可执行文件时遇到问题,它可能与以下内容有关:
故障路径。最初我有很多问题,因为我指向的是mac-otest。我在发射时一直崩溃,终止代码是6。
错误的论点。在我从bundle(.octest)名称中删除空间之前,我一直有Otest崩溃,退出代码为1。
环境变量中的路径错误。肖恩教程有很多后续问题,让人们对其他人的尝试有所了解。集合i
- 提到的数字在哪里?
- 由于权限太低,我无法将它们包括进来…
- 我很感谢你写一篇如何写的文章,但是你也可以发表一个答案并相应地做标记吗?否则,这篇文章将永远排在"未回答问题"列表的首位。唯一的另一个办法是解决这个问题,这个问题似乎不符合你的善意。
- @阿德里安。写下答案,问题就结束了。
- 你能提到这个如何应用的Xcode版本吗?我看起来像3.x,对吧?Xcode4有什么好运气吗?您还应该添加[ios]标签。
- 帕利蒙多。完成。谢谢你的评论。Xcode是3.2.5版。我还没有用xcode 4测试它,但是我会根据需要更新条目。
- 这篇文章怎么只有六张赞成票?
- @百事可乐很好,也许用OcUnit进行的单元测试并不是那么流行…但谢谢你的关注。
这篇文章的本意是"如何"而不是一个真正的问题。因此,这个答案只是让我把"如何"标记为"已回答"。这可能会被社区标记为不规则。我正在征求关于在哪里张贴未来"如何做"文章的建议。
不过,关于这个主题还有最后一点要注意。对于那些仍然怀疑编写单元测试是否值得的人,我肯定会说是的!
我目前正在编写一个具有coredata和从Web服务检索数据(XML解析)的应用程序。整个模型可以测试和调试,而无需:
在模拟器或设备上运行实际应用程序。不必使用设备来运行测试是一个巨大的时间增益。这是每次跑步2分钟到5秒之间的差异。
在测试模型时不需要创建视图或控制器。完整的开发和测试只能在第一次迭代中集中在模型上。一旦模型被清除为集成,其余的开发就可以遵循。
为了调试XML解析,我可以简单地使用我完全控制的"硬编码"文件。
当然,关键是在代码中实现特性时编写测试。就整个应用程序的调试而言,这确实是一个省时的方法。
好的,我就到此为止。
- 再次感谢您的指导。StackOverflow是张贴此类文章的好地方。我只建议问一个问题(在本例中,"我如何运行和调试iPhone应用程序的单元测试?")然后写一篇如何做的文章作为你自己问题的答案。我知道你只能在48小时后把它标记为答案,但这似乎是发布操作指南和按规则玩的最佳方式,所以…再次抱歉批评你的职位,我知道你只是想帮忙。
- @阿德里安。这是一个很好的观点。以后我会这样处理的。尽管我还在学习,但别难过。所以谢谢你的评论。
- +1关于你为什么要测试。
- 你对应用程序测试有什么建议吗?如果使用"测试"方案运行,应用程序测试将在模拟器中失败;如果在设备上使用"运行"方案运行,应用程序测试不会在断点处停止。根据developer.apple.com/library/ios/documentation/xcode/concept‌&8203;ual/…"因为应用程序测试只在设备上运行,所以您也可以使用这些测试来执行硬件测试,例如获取设备的位置。"
- 没有关系。我测试的时候一定做错了什么。正如您的文章所提到的,我可以正常调试。
我可以通过以下简单步骤在调试器中运行测试用例:
产品>构建用于>测试
在要调试的部分测试中放置断点
产品>测试
这是Xcode6.0.1上的代码,似乎比上面描述的长过程更方便。