代码之家  ›  专栏  ›  技术社区  ›  Aviad Ben Dov

如何使用nsdebugnabled、nszombienabled、mallocstacklogging运行ocUnit(sentestingkit)?

  •  2
  • Aviad Ben Dov  · 技术社区  · 15 年前

    我有一个类似于 this post . 现在,我确信我在某个地方犯了一些愚蠢的错误,可能与释放一个对象、一个观察者或其他什么不相关,但是由于我似乎找不到调试代码的方法,所以我认为我可以使用nsdebugnabled、nszombienabled和mallocstacklogging(如图所示 here )

    可以用眼罩吗?如果是这样,怎么办?我只是找不到一个“可执行文件”来设置这些参数…

    谢谢! 阿维亚德

    4 回复  |  直到 13 年前
        1
  •  3
  •   Aviad Ben Dov    15 年前

    不幸的是,戴夫的解决方案不起作用-我总是出错。我最终让GHUnit负责我的项目,通过调试发现了问题,但它有它自己的问题,所以我现在使用它和ocUnit,也就是 轻微地 在“结果”选项卡中显示结果时更好地集成。

    叹息 . 我们什么时候能看到 好的 完整的OBJ-C单元测试框架?

        2
  •  3
  •   Kalle    13 年前

    这可能在最近的xcode中被修复了,但我通过这样做而变得僵尸。

    1. 进入方案(命令<)
    2. 打开测试,然后打开参数选项卡
    3. 取消选中“使用运行操作的参数和环境变量”
    4. “+”环境变量“nszombieEnabled”=“是”
        3
  •  2
  •   Dave DeLong    15 年前

    好, NSZombieEnabled 朋友是环境变量,这意味着它们必须在可执行文件上运行。单元测试包的默认设置是在 建造 过程,而不是在执行过程中。

    因此,解决这个问题的方法是使测试不在构建阶段运行,而是作为可执行文件的一部分运行。

    我是这样做的:

    1. 在单元测试包目标中,删除“运行脚本”构建阶段。在编译测试之后,就是执行测试的那个步骤。
    2. 从项目菜单中,选择“新建自定义可执行文件…”并将其命名为有意义的文件,如“otest”
    3. 将可执行路径设为 otest 二进制文件,应位于 /Developer/Tools/otest
    4. 在otest可执行文件上设置以下环境变量:
      • DYLD_FRAMEWORK_PATH = & gt; {UnitTest.bundle}/Contents/Frameworks
      • DYLD_LIBRARY_PATH = & gt; unittest.bundle/内容/框架
    5. 在otest可执行文件上设置以下程序参数:
      • -SenTest All (这将运行所有单元测试)
      • {UnitTest.bundle}

    现在,您可以选择单元测试包作为活动目标,并选择OTest可执行文件作为活动可执行文件,然后构建和调试。这将允许您设置断点,设置其他环境变量(如 启用NSZMN 等等。

    如果只想调试某个套件或特定的单元测试,可以更改 -所有句子 论证 -SenTest MyUnitTestSuite -SenTest MyUnitTestSuite/myUnitTestMethod .

        4
  •  2
  •   MiKL    15 年前

    我花了相当长的时间,但我终于设法使它为我的项目工作。 为了创建我遵循的“逻辑”测试 Apple guidelines on creating logic tests . 一旦您了解逻辑测试是在构建期间运行的,这就可以很好地工作。

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

    我将回顾肖恩的教程中介绍的主要步骤,其中提供了一些“针对假人”的大纲,我花了一些时间来了解:

    1. 设置包含单元测试但不运行它们的目标
    2. 设置otest可执行文件以运行测试
    3. 设置otest环境变量,以便otest可以找到单元测试

    步骤1-设置目标

    1. 复制位于项目目标下的单元测试目标。这还将创建单元测试产品(.octest文件)的副本。下图中,“UnitTest”是原始目标。
    2. 将单元测试目标和单元测试产品(.octest文件)重命名为相同的名称。在下图中,“unittestsdebug”是重复的目标。
    3. 删除新目标的runscript阶段

    两者的名称可以是任何东西,但我会避免空格。

    步骤2-设置otest

    这里最重要的一点是要获得正确的otest,即当前iOS的otest,而不是默认的Mac版本。这在肖恩的教程中有很好的描述。以下是一些帮助我纠正问题的更多细节:

    1. 转到项目->新建自定义可执行文件。这将弹出一个窗口,提示您输入可执行文件名和可执行路径。
    2. 输入您想要的名称。
    3. 复制粘贴到iOS otest可执行文件的路径。在我的例子中,这是/developer/platforms/iphoneSimulator.platform/developer/sdks/iphoneSimulator4.2.sdk/developer/usr/bin/otest
    4. 按回车键。这将使您进入可执行文件的配置页面。
    5. 此时唯一要更改的是选择“路径类型:相对于当前的SDK”。不要键入路径,这是在步骤3中完成的。

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

    otest参数的设置很简单…但事实证明这是我最大的问题。我最初将逻辑测试目标命名为“LogictestsDebug”。使用这个名称和“logictests debug.octest”(带引号)作为otest的参数,我一直让otest以退出代码1终止,从不停止进入我的代码中…

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

    Otest的论点是:

    1. -Sentest self(或全部或一个测试名称-在终端中键入man otest以获取列表)
    2. 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可执行文件并开始调试测试,需要:

    1. 将活动目标设置为单元测试目标(在我的例子中是logictestsdebug)
    2. 将活动可执行文件设置为OTest可执行文件

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

    作为补充说明,如果在运行otest可执行文件时遇到问题,它可能与以下内容有关:

    1. 故障路径。最初我有很多问题,因为我指向的是mac-otest。我在发射时一直崩溃,终止代码是6。
    2. 错误的论点。在我从bundle(.octest)名称中删除空间之前,我一直有Otest崩溃,退出代码为1。
    3. 环境变量中的路径错误。[Sean Tutorial][8]有很多后续问题,可以帮助您了解其他人的尝试。我现在有一套似乎可以用,所以我建议你从这个开始。

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

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

    最后一件事…

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

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