我的一些单元测试测试没有在XCode 4.4中完成

时间:2012-09-06 20:58:59

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

我见过有人在这里和其他地方发帖,但我找不到任何有效的解决方案。我正在使用XCode 4.4并设置了一系列单元测试。我之前在这个项目上运行过它们,所以我知道如果他们真的跑了,他们确实会通过/失败。

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

FooTests did not finish
    testFoo did not finish

XCode将报告测试是否成功,无论未完成的测试中发生了什么。另外需要注意的是,有时它是一个不能完成的不同测试,有时候多个套件无法完成。我没有注意到所有测试都完成的情况,但从这种看似随机的行为来判断,我认为这是可能的。

那么,这是XCode中的一个错误吗?我无法想到任何其他原因导致测试随机完成,然后导致XCode报告一切都成功。有没有解决方案?

7 个答案:

答案 0 :(得分:17)

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

 [NSThread sleepForTimeInterval:1.0];

答案 1 :(得分:4)

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

我有一个测试,它在循环中做了一些工作,当它从循环中掉出来时没有做任何其他事情,我得到了“没有完成”的错误。

为了证明测试结束,我将其添加为最后一行:

NSLog(@"done");

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

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

答案 2 :(得分:4)

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

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

答案 3 :(得分:3)

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

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

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

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

答案 4 :(得分:2)

我在Log Navigator中有相同的警告。我为我修好了。

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

  1. 转到产品 - >编辑方案......
  2. 在方案选择器中选择UnitTest方案
  3. 选择“测试” - 左侧的图标
  4. 将调试器从LLDB更改为GDB,然后按确定
  5. 测试现在应该结束了。 (对我而言,它运作良好)

答案 5 :(得分:2)

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

答案 6 :(得分:0)

我在使用XCode 4.6时遇到了同样的问题,在我的情况下,它的原因是该方案与测试套件中的实际单元测试之间存在不一致。 在该计划中我检查了一些西装,但在他们的.m文件中,一些单元测试被评论。

要解决问题:要么取消注释测试,要么取消选择方案中的文件/套装,所有内容都将变为绿色:)

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

  1. 右键单击方案部分中的项目名称(右侧的停止按钮)
  2. 选择编辑方案
  3. 选择测试调试
  4. 单击单元测试项目旁边的三角形,然后单击每个文件旁边的复选框
  5. 取消选中您在评论中放置单元测试的文件
  6. 希望这会有所帮助