jjzjj

iphone - 如何运行和调试 iPhone 应用程序的单元测试

coder 2023-07-26 原文

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

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

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

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

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

  • 以下是使用 执行的XCode 3.2.5

    XCode 4 的注意事项

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

    第 1 步 - 设置目标
  • 复制位于项目目标下的单元测试目标。这还将创建单元测试产品(.octest 文件)的副本。下图中“LogicTest”是原始目标。
  • 将单元测试目标和单元测试产品(.octest 文件)重命名为相同的名称。在下图中,“LogicTestsDebug”是复制目标。
  • 删除新目标的 RunScript 阶段

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



    第 2 步 - 设置 otest

    这里最重要的一点是获得正确的 otest,即适用于您当前 iOS 的而不是默认的 Mac 版本。这在 Sean 的教程中有很好的描述。以下是一些帮助我正确设置的更多细节:
  • 转到项目-> 新建自定义可执行文件。这将弹出一个窗口,提示您输入可执行文件名称和可执行文件路径。
  • 输入任何您想要的名称。
  • 将路径复制粘贴到您的 iOS otest 可执行文件。就我而言,这是/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.2.sdk/Developer/usr/bin/otest
  • 按回车键。这将带您进入可执行文件的配置页面。
  • 此时唯一要更改的是选择“路径类型:相对于当前 SDK”。不要输入路径,这是在步骤 3 中完成的。

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

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

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

    otest 的论据是:
  • -SenTest Self(或全部或测试名称 - 在终端中输入 man otest 以获取列表)
  • {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 可执行文件并开始调试您的测试,您需要:
  • 将事件目标设置为单元测试目标(在我的情况下为 LogicTestsDebug)
  • 将您的事件可执行文件设置为您的 otest 可执行文件

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

    附带说明一下,如果您在运行 otest 可执行文件时遇到问题,可能与:
  • 路径错误。最初我遇到了很多问题,因为我指向的是 mac otest。我在启动时一直崩溃,终止代码为 6。
  • 错误的论据。在我从包 (.octest) 名称中删除空格之前,我一直遇到退出代码 1 的 otest 崩溃。
  • 环境变量中的错误路径。 Sean 教程有很多后续问题,可以让您了解其他人的尝试。我现在拥有的套装似乎有效,所以我建议你从这个开始。

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



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



    最后一件事...

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

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

    最佳答案

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

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

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

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

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

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

    瞧,我会就此放手。

    关于iphone - 如何运行和调试 iPhone 应用程序的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4989668/

    有关iphone - 如何运行和调试 iPhone 应用程序的单元测试的更多相关文章

    1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

      我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

    2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

      总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

    3. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

      很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

    4. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

      我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

    5. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

      关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

    6. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

      给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

    7. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

      我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

    8. ruby - 将差异补丁应用于字符串/文件 - 2

      对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

    9. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

      我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

    10. ruby - 如何指定 Rack 处理程序 - 2

      Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

    随机推荐