我有一个类似于这篇文章中的错误。现在,我确定我在某处犯了一些愚蠢的错误,可能与释放对象或观察者或其他什么有关,但由于我似乎找不到调试代码的方法,我认为我可以使用NSDebugEnabled、NSZombieEnabled 和 MallocStackLogging(如图所示)。
可以使用 OCUnit 完成吗?如果是这样,怎么做?我只是找不到一个“可执行文件”来设置这些参数......
谢谢!阿维亚德。
这可能已在最近的 Xcode 中得到修复,但我通过这样做得到了僵尸
不幸的是,戴夫的解决方案没有奏效——我不断出错。我最终让 GHUnit 在我的项目上工作,通过调试发现了问题,但它有自己的问题,所以我现在同时使用它和 OCUnit,后者在结果选项卡中显示结果方面集成得更好。
叹息。我们什么时候才能看到一个好的、完整的 Obj-C 单元测试框架?
好吧,NSZombieEnabled
朋友是环境变量,这意味着它们必须在可执行文件上运行。单元测试包的默认设置是在构建过程中运行测试,而不是在执行过程中。
所以解决这个问题的方法是让你的测试不在构建阶段运行,而是将它们作为可执行文件的一部分运行。
我是这样做的:
otest
二进制文件,该文件应位于/Developer/Tools/otest
DYLD_FRAMEWORK_PATH
=>{UnitTest.bundle}/Contents/Frameworks
DYLD_LIBRARY_PATH
=>{UnitTest.bundle}/Contents/Frameworks
-SenTest All
(这将运行所有的单元测试){UnitTest.bundle}
您现在可以选择您的单元测试包作为活动目标,并将 otest 可执行文件作为活动可执行文件,然后构建和调试。这将允许您设置断点、设置其他环境变量(如NSZombieEnabled
)等等。
如果您只想调试某个套件或特定单元测试,您可以将-SenTest All
参数更改为-SenTest MyUnitTestSuite
or -SenTest MyUnitTestSuite/myUnitTestMethod
。
我花了很长时间,但我终于设法使它适用于我的项目。为了创建“逻辑”测试,我遵循了 Apple 关于创建逻辑测试的指南。一旦您了解逻辑测试是在构建期间运行的,这就可以正常工作。
为了能够调试这些测试,需要创建一个自定义可执行文件来调用这些测试。Sean Miceli 在 Grokking Cocoa 博客上的文章提供了执行此操作的所有信息。然而,遵循它并没有立即取得成功,需要进行一些调整。
我将回顾 Sean 教程中介绍的主要步骤,提供了一些“傻瓜”大纲,我花了一些时间才弄清楚:
两者的名称可以是任何名称,但我会避免使用空格。
这里最重要的一点是要获得正确的 otest,即适用于您当前 iOS 的那个,而不是默认的 Mac 版本。这在 Sean 的教程中有很好的描述。以下是一些帮助我正确设置的细节:
otest 参数设置起来很简单……但这被证明是我最大的问题。我最初将我的逻辑测试目标命名为“LogicTests Debug”。使用这个名称和“LogicTests Debug.octest”(带引号)作为 otest 的参数,我一直让 otest 以退出代码 1 终止并且永远不会停止到我的代码中......
解决方案:目标名称中没有空格!
otest 的论据是:
以下是用于复制/粘贴的环境变量列表:
请注意,我也尝试了 DYLD_FORCE_FLAT_NAMESPACE 但这只是让 otest 崩溃。
要运行您的 otest 可执行文件并开始调试您的测试,您需要:
您可以构建和运行可执行文件并使用断点调试测试。
作为旁注,如果您在运行 otest 可执行文件时遇到问题,则可能与:
您可能会在控制台中收到一些消息,这可能会导致您认为环境变量有问题。您可能会注意到有关 CFPreferences 的消息。此消息不会阻止测试正常运行,因此如果您在运行 otest 时遇到问题,请不要关注它。
最后,一旦一切正常,您将能够在测试中的断点处停止。
我在许多博客上读到集成 XCode SenTestKit 的主要限制是在构建应用程序时无法运行测试。事实证明,这实际上很容易管理。您只需将 Logic 测试包作为依赖项添加到您的应用程序项目中。这将确保在构建应用程序之前构建您的逻辑测试包,即运行所有测试。
为此,您可以将逻辑测试包拖放到应用程序目标上。