注意:现在设置单元测试要容易得多。本教程与 Xcode 版本 5 及更高版本无关。
我花了很长时间,但我终于设法使它适用于我的项目。为了创建“逻辑”测试,我遵循了 Apple 关于创建逻辑测试的指南。一旦您了解逻辑测试是在构建期间运行的,这就可以正常工作。
为了能够调试这些测试,需要创建一个自定义可执行文件来调用这些测试。Sean Miceli 在 Grokking Cocoa 博客上的文章提供了执行此操作的所有信息。然而,遵循它并没有立即取得成功,需要进行一些调整。
我将回顾 Sean 教程中介绍的主要步骤,提供了一些“傻瓜”大纲,我花了一些时间才弄清楚:
- 设置一个包含单元测试但不运行它们的目标
- 设置 otest 可执行文件以运行测试
- 设置 otest 环境变量,以便 otest 可以找到您的单元测试
以下是使用XCode 3.2.5执行的
XCode 4 的注意事项
在 XCode 4 中,可以直接调试您的单元测试。只需编写您的测试,将其作为测试之一添加到您的目标并在其中设置断点。就这样。还会有更多。
第 1 步 - 设置目标
- 复制位于项目 Targets 下的单元测试目标。这还将创建单元测试产品的副本(.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 崩溃。
- 环境变量中的路径错误。肖恩教程有很多后续问题,可以让您深入了解其他人的尝试。我现在的套装似乎可以工作,所以我建议你从这个开始。
您可能会在控制台中收到一些消息,这可能会导致您认为环境变量有问题。您可能会注意到有关 CFPreferences 的消息。此消息不会阻止测试正常运行,因此如果您在运行 otest 时遇到问题,请不要关注它。
最后,一旦一切正常,您将能够在测试中的断点处停止。
最后一件事...
我在许多博客上读到集成 XCode SenTestKit 的主要限制是在构建应用程序时无法运行测试。事实证明,这实际上很容易管理。您只需将 Logic 测试包作为依赖项添加到您的应用程序项目中。这将确保在构建应用程序之前构建您的逻辑测试包,即运行所有测试。
为此,您可以将逻辑测试包拖放到应用程序目标上。