【问题标题】:Some of my unit tests tests are not finishing in XCode 4.4我的一些单元测试测试没有在 XCode 4.4 中完成
【发布时间】:2012-08-31 18:12:03
【问题描述】:

我已经看到有人在这里和其他地方发布过这个问题,但我还没有找到任何可行的解决方案。我正在使用 XCode 4.4 并设置了一堆单元测试。我以前在这个项目上运行过它们,所以我知道如果它们实际运行,它们确实会通过/失败。

我有大约 15 个测试套件,每个套件包含 1-7 个测试。在大多数尝试中,所有测试套件都完成(并通过),除了 1(FooTests)。它给出了警告:

FooTests did not finish
    testFoo did not finish

XCode 将报告测试成功,无论未完成的测试发生什么。还有一点需要注意,有时是不同的测试无法完成,有时多个套件无法完成。我没有注意到所有测试都完成的情况,但从这种看似随机的行为来看,我相信这是可能的。

那么,这是 XCode 中的错误吗?我想不出任何其他原因导致随机测试未完成,然后导致 XCode 报告一切都成功。有什么解决办法吗?

【问题讨论】:

  • 发现了同样的问题。清理目标并运行测试似乎可以在它弹出时解决问题。我认为这是一个错误。
  • 清洁对我不起作用:/
  • 我也遇到了这个问题,但我发现它似乎只发生在我没有同时运行所有测试时。如果我编辑方案并取消选中某些测试,我最终会收到“未完成”警告,否则我不会。

标签: objective-c xcode unit-testing ocunit xcode4.4


【解决方案1】:

我刚刚遇到了 XC4.5DP4 的这个问题。

我有一个测试,它在循环中做一些工作,当它退出循环时什么都不做,我得到了“没有完成”错误。

为了证明测试已经完成,我在最后一行添加了这一行:

NSLog(@"done");

不仅“完成”被打印到输出 - 现在 Xcode 表示测试已经完成。

似乎是一种解决方法...去看看。

【讨论】:

  • 这对我来说可以可靠地重现 - 如果我再次拿走日志记录行,Xcode 会回到说“没有完成”。但是,您的里程可能会有所不同...
  • 这对我没有任何帮助。对我来说没有完成的测试涉及一个 Web 请求,它可能不会等到请求完成才能运行其余的测试。但是我有其他使用 Web 请求的测试可以正常工作......
  • 我也看到了这个……很奇怪。
【解决方案2】:

我在日志导航器中遇到了同样的警告。我为我修好了。

在我的项目中,我有 2 个方案,一个用于运行项目,一个用于单元测试。

  1. 转到产品 --> 编辑方案...
  2. 在方案选择器中选择 UnitTest 方案
  3. 选择左侧的“测试”图标
  4. 将调试器从 LLDB 更改为 GDB,然后按 OK
  5. 测试现在应该结束了。 (对我来说效果很好)

【讨论】:

  • 过去对我有用,但在这种情况下不起作用。
【解决方案3】:

我正在使用 XCode46-DP3,我刚刚在测试中解决了这个问题。我有几个测试启动一个 Web 服务器,然后对其执行 http 调用;在测试结束时,Web 服务器停止。在上周,这些测试开始出现“未完成”的警告。 对我来说,在这些测试结束时添加以下 sleep 就足够了(我已经在 tearDown 中添加了它):

- (void)tearDown {
  [self.httpServer stop];
  [NSThread sleepForTimeInterval:1.0];
  self.httpServer = nil;
  self.urlComposer = nil;
}

【讨论】:

  • +1 表示您将其放入“tearDown”中。只有一条评论:你不应该在这里调用 [super tearDown] 吗?
【解决方案4】:

我在 XCode 4.5.2 上。对于应用程序单元测试,如果您的测试套件完成得太快以至于在此之前没有正确加载主应用程序,您将收到警告。您可以通过在测试结束时添加睡眠来简单地避免该问题,如下所示。逻辑单元测试不会发生这种情况。

 [NSThread sleepForTimeInterval:1.0];

【讨论】:

  • 我发现你实际上可以制作这个0.0,而且效果也很好(并且不会减慢你的测试速度)。
  • 在快速套件上,我仍然看到它是 0.0。我已将此代码放入我的 tearDown 函数中:- (void)tearDown { static int loaded = FALSE; if (!loaded) { [NSThread sleepForTimeInterval:1.0]; loaded = TRUE; } [super tearDown]; }
  • 今天刚看到这个,以为我疯了,哈哈,谢谢你的解释!
【解决方案5】:

我在运行 XCode 4.6 时遇到了同样的问题,就我而言,其原因是该方案与测试套件中的实际单元测试不一致。 在该方案中,我检查了一些套装,但在他们的 .m 文件中对一些单元测试进行了注释。

解决问题:取消注释测试或取消选择方案中的文件/诉讼,所有将再次变为绿色:)

对于像我这样忘记如何达成计划的人来说,这些是必需的步骤:

  1. 右键单击方案部分中的项目名称(停止按钮右侧)
  2. 选择编辑方案
  3. 选择测试调试
  4. 单击单元测试项目旁边的三角形,每个文件旁边都有一个复选框
  5. 取消选中您在 cmets 中放置单元测试的文件

希望对你有帮助

【讨论】:

    【解决方案6】:

    问题似乎是您的测试终止太快,Xcode 无法接收和解析指示失败或成功的日志消息。在最后一个测试用例运行中睡眠 1 秒对我来说可靠,而 0.0 则没有。要查看哪个测试用例是最后一个测试用例,请检查方案对话框中的测试操作。

    我使用单一方法创建了一个单独的 WorkaroundForTestsFinishingTooFast 测试用例:

    - (void)testThatMakesSureWeDontFinishTooFast
    {
        [NSThread sleepForTimeInterval:1.0];
    }
    

    问题在于,当您添加更多测试用例时,您必须确保此测试是最后运行的方法。这意味着从 Test 操作中删除和添加此类,因为不允许重新排序测试用例。另一方面,您只是将整个测试包延迟了 1 秒。

    【讨论】:

    • 我在tearDown添加了延迟,不用担心。
    【解决方案7】:

    对我来说,解决方案是减少测试正在测试的应用程序部分的日志记录输出。我认为 xcode 无法及时解析测试输出,因为我在整个应用程序中都有其他输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 1970-01-01
      • 1970-01-01
      • 2023-01-09
      • 1970-01-01
      • 2017-02-22
      • 2018-02-25
      相关资源
      最近更新 更多