我跟着Apple的instructions在我的项目中设置单元测试。我按照指示使它们依赖,所以测试运行我的主项目的每个构建。这是有效的,当我的测试通过时,应用程序运行;如果他们不这样做,我会在失败的单元测试中遇到构建错误。
但是,我希望能够在测试失败时逐步执行我的应用程序代码,但无法正确配置Xcode(3.2.5)。该项目是一个Mac项目,而不是iOS。
我尝试了here和here指令,但执行从未在我设置的断点处停止,无论是在单元测试代码中还是在我的应用程序代码中。在遵循第一组指令后,我设置的断点变为黄色并带有蓝色轮廓,我也不知道这意味着什么。我需要做什么才能完成测试?
更新
我发现另一个页面试图通过向我的主可执行文件添加参数和环境变量来解决这个问题(here),但同样,这些不会导致执行停止在我的断点处。我还注意到我的测试(大量)日志语句也没有显示在我的调试器控制台中。
我还发现黄色断点意味着在运行时无法找到的代码。这些都在我的测试用例类中,所以这似乎无法解释为什么那些没有解雇。
答案 0 :(得分:2)
使用Xcode 3.2调试我的OCTest测试通常没有问题,包括在断点处停止。
基本思想是告诉gdb使用bundle作为参数启动otest。您将通过将/Developer/Tools/otest
作为自定义可执行文件添加到Xcode项目中,然后将您的OCTest包名称作为唯一参数(在“项目”菜单中选择“编辑活动可执行文件”,并在第二个选项卡中添加一行)在顶部框中使用Foo.octest来调试Foo测试。)
现在,如果您点击调试按钮,它将立即开始调试您的测试包,并将停止在声明的断点处(如果您点击构建和调试,如果测试未通过则可能无法启动)。另请注意,您可能必须将环境变量设置为YES以禁用垃圾回收(在相同“参数”选项卡的底部框中),如果需要,otest将准确告诉您。
如果您执行了上述所有操作并且仍无法执行测试代码,则可能是因为它是在关闭调试符号生成的情况下编译的 - 请检查调试版本设置,但很可能是因为测试代码未重新编译一点都不我说很有可能,因为你的日志没有显示在控制台中,NSLog应该在Xcode控制台中写入。手动清理构建和bin文件夹,有时当您更改路径或名称时,最终会加载过时的代码。您可能还想检查文件是否未跳出测试目标(同一个非记录文件中的失败测试?)。
答案 1 :(得分:2)
我有一个Hiedi Utley在http://hiediutley.wordpress.com/2011/03/08/xcode3-debugging-ios-unit-tests/发布的变体。我不喜欢它的是单元测试包目标的重复,一个包含运行脚本阶段在构建后执行单元测试,另一个没有运行单元测试。我在“运行脚本”阶段的“获取信息”窗格中注意到切换“仅在安装时运行脚本”,并认为这是在正常模式下运行单元测试并在调试器中运行它们之间切换的方法。
根据Hiedi的说明,创建一个新的可执行项,比如LogicTestsGDB。像这样配置:
常规标签:
- 路径:
Developer/usr/bin/otest
(无领先/
)- 路径类型:
Relative to Current SDK
- 将工作目录设置为:
Build Products directory
参数选项卡:
- 参数:您的UnitTest Bundle (例如,LogicTests.octest)
- 要在环境中设置的变量
DYLD_LIBRARY_PATH ... : ${BUILD_PRODUCTS_DIR}:${DYLD_LIBRARY_PATH}
DYLD_FRAMEWORK_PATH . : ${SDKROOT}/Developer/Library/Frameworks
DYLD_ROOT_PATH ...... : ${SDKROOT}
IPHONE_SIMULATOR_ROOT : ${SDKROOT}
OBJC_DISABLE_GC : YES
DYLD_NEW_LOCAL_SHARED_REGIONS : YES
DYLD_NO_FIX_PREBINDING : YES
CFFIXED_USER_HOME : ${HOME}/Library/Application Support/iPhone Simulator/
完成。现在调试你的单元测试,
要正常运行,请在应用程序的构建阶段执行单元测试:
为了自动执行上述步骤,我创建了一个简单的AppleScript脚本,可在两种状态之间切换:
property kApplicationName : "MyApp" -- name of the normal application to build
property kUnitTestName : "LogicTests" -- name of the bundle target to debug
property kUnitTestRunner : "LogicTestGDB" -- name of the executable to use when debugging the unit test bundle
tell application "Xcode"
tell the active project document
set theTarget to first target whose name is kUnitTestName
set thePhase to first run script phase of theTarget
if name of active target is kApplicationName then
set active target to theTarget
set theExecutable to first executable whose name is kUnitTestRunner
set active executable to theExecutable
set run only when installing of thePhase to true
else
set theTarget to first target whose name is kApplicationName
set active target to theTarget
set theExecutable to first executable whose name is kApplicationName
set active executable to theExecutable
set run only when installing of thePhase to false
end if
return "Targeting " & (name of active executable)
end tell
end tell
答案 2 :(得分:1)
我也尝试过你提供的链接中的解决方案,但也没有对我有用。但后来我找到了这个:http://hiediutley.wordpress.com/2011/03/08/xcode3-debugging-ios-unit-tests/ - 它就像一个魅力:)新鲜的东西。
答案 3 :(得分:0)
开发您的单元测试,以便它们包含一个驻留在具有目标的项目中的程序,然后只需打开依赖项目并在其中工作。这可能是一个带有库和可执行文件的项目,它通过库调用(2个目标)。然后你就可以打开项目并进行调试,而依赖项中的单元测试会调用这个库。这是一种更模块化的方法。
祝你好运答案 4 :(得分:0)
最终为我工作的唯一事情就是升级到Xcode 4.它整合得很漂亮。有一个little bit of pain移动到它,但现在已经结束了,整合很棒。我完全能够完成我的测试和应用程序代码。