我的一些单元测试在XCode 4.4中无法完成测试

28

我看到很多人在这里和其他地方发布了关于这个问题的帖子,但是我没有找到任何可行的解决方案。我正在使用XCode 4.4,并且已经设置了一堆单元测试。我以前在这个项目上运行过所有这些测试,所以我知道它们在应该运行时会通过/失败。

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

FooTests did not finish
    testFoo did not finish

XCode会报告测试成功,不管未完成的测试发生了什么。还有一件事需要注意,有时候是不同的测试不会完成,有时候是多个测试套件都不会完成。我没有注意到所有测试都完成的情况,但根据这种看似随机的行为,我相信这是有可能的。

那么,这是XCode的一个错误吗?我想不出任何其他原因导致测试随机地无法完成,然后导致XCode报告所有内容都成功。是否有任何解决方案?


发现了相同的问题。清理目标并运行测试似乎可以解决它出现的问题。我认为这是一个 bug。 - timthetoolman
清理对我没用 :/ - Logan Serman
我也遇到了这个问题,但我发现只有当我没有一次性运行所有测试时才会出现。如果我编辑方案并取消选中某些测试,则会出现“未完成”的警告,否则不会出现。 - Cruinh
7个回答

17

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

 [NSThread sleepForTimeInterval:1.0];

1
我发现你实际上可以将其设置为0.0,这同样有效(并且不会减慢测试速度)。 - Tony Arnold
2
在快速套件上,我仍然看到它为0.0。我已经将此代码放入我的tearDown函数中:- (void)tearDown { static int loaded = FALSE; if (!loaded) { [NSThread sleepForTimeInterval:1.0]; loaded = TRUE; } [super tearDown]; } - AlexChaffee
今天刚看到这个,以为自己疯了哈哈,谢谢你的解释! - Zhang

4

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

我有一个测试,在循环中执行一些工作,当它跳出循环时不做任何其他操作,但是我一直收到“未完成”错误。

为了证明测试已经完成,我将以下内容添加为最后一行:

NSLog(@"done");

不仅会将“完成”打印到输出中 - 现在Xcode还会显示测试已完成。

看起来是一种解决方法...难以想象。


这对我来说是可靠的复现 - 如果我再次删除日志记录行,Xcode会回到“未完成”的状态。然而,您的情况可能会有所不同... - Sam Deane
这对我没有任何帮助。对我来说无法完成的测试涉及到一个Web请求,可能不会等待请求完成就运行其余的测试。但是我有其他使用Web请求的测试可以正常工作... - Logan Serman
我也看到了这个...很奇怪。 - seanicus

4

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

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

+1 如果你在 "tearDown" 方法中提到了它。只有一点建议:你应该在这里调用 [super tearDown] 吗? - martin jakubik

3
问题似乎是您的测试结束得太快,以至于Xcode无法接收和解析指示失败或成功的日志消息。在最后一个测试案例中睡眠1秒对我来说非常可靠,而0.0则不行。要查看哪个测试案例是最后一个测试案例,请检查方案对话框中的测试操作。
我创建了一个单独的WorkaroundForTestsFinishingTooFast测试案例,其中只有一个方法:
- (void)testThatMakesSureWeDontFinishTooFast
{
    [NSThread sleepForTimeInterval:1.0];
}

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

我在 tearDown 中添加了延迟,不用担心。 - meaning-matters

2
对我而言,解决方案是减少测试部分应用程序的日志输出。我认为由于应用程序中其他的输出内容,Xcode在时限内无法解析测试输出。

2

我在日志导航器中也遇到了相同的警告信息。我为自己解决了这个问题。

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

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

4
过去这种方法对我行得通,但在这种情况下不起作用。 - Logan Serman

0
我在 XCode 4.6 上遇到了同样的问题,我的情况是方案与实际测试套件中的单元测试不一致。在方案中,我有一些套件被选中,但在它们的.m文件中,一些单元测试被注释了。
解决问题的方法:要么取消注释测试,要么在方案中取消选择文件/套件,然后所有内容都将变成绿色:)
对于像我这样忘记如何打开方案的人,以下是所需步骤:
  1. 在方案部分(停止按钮右侧)右键单击项目名称
  2. 选择编辑方案
  3. 选择测试/debug
  4. 单击单元测试项目旁边和每个文件旁边的三角形,您会看到一个复选框
  5. 取消选中已将单元测试放在注释中的文件
希望这可以帮助到你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接