XCTAssertTrue不会停止例行程序

Pha*_*ast 9 xcode unit-testing xcode5

在失败的断言时,Xcode不会终止测试例程.它是否正确?我无法理解这背后的原因,我希望它表现得像assert并让它终止程序.通过以下测试,它将打印"仍在运行".这是有意的吗?

- (void)testTest
{
    XCTAssertTrue(false, @"boo");
    NSLog(@"still running");
}
Run Code Online (Sandbox Code Playgroud)

我不知道这将如何有用,因为当前提条件不满足时,后续代码通常会崩溃:

- (void)testTwoVectors
{
    XCTAssertTrue(vec1.size() == vec2.size(), @"vector size mismatch");

    for (int i=0; i<vec1.size(); i++) {
        XCTAssertTrue(vec1[i] == vec2[i]);
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*k R 10

你可以改变这种行为XCTAssert<XX>.
在设置方法中将值更改self.continueAfterFailure为NO.

IMO在测试断言失败后停止测试是更好的行为(防止崩溃导致不运行其他重要测试).如果测试需要在失败后继续,这意味着测试用例只需要很长时间就可以拆分.


mat*_*att 2

是的,这是有意的。这就是单元测试的工作原理。测试失败并不终止测试;它只是未通过测试(并如此报告)。这很有价值,因为您不想仅仅因为一项测试失败而失去其他测试是否通过的信息。

如果(正如您在补充中所说)测试方法然后继续抛出异常,那么它会抛出异常 - 而且您知道为什么。但是异常被捕获了,那么问题出在哪里呢?其他测试方法仍然运行,因此您的结果仍然符合您的预期:一种方法测试失败然后停止,其他测试执行它们所做的任何事情。然后你会在日志中看到类似这样的内容:

Executed 7 tests, with 2 failures (1 unexpected) in 0.045 (0.045) seconds
Run Code Online (Sandbox Code Playgroud)

第一个失败是 XCTAssert。第二个是例外。

  • 我想你误解了我的问题。我知道每个测试方法都是独立于其他方法的,但在这种情况下,在一种方法中,一个失败的断言不会导致该方法的终止。我不明白这有什么用处,因为当不满足先决条件时,后续代码通常会崩溃。 (3认同)
  • 我想你误解了我的回答。你这么问就说明你不知道。一个人的直觉期望并不是决定答案的因素;而是决定答案的因素。现实确实如此。 (3认同)
  • @matt“这就是单元测试的工作原理”不是一个有用的答案。例如,在 JUnit 中,断言停止测试方法(当然测试类继续运行其他测试方法)。这与 XCTAssert 默认情况下的操作相反。从 JUnit 背景来看,令人困惑的是为什么在方法中断言失败后您想要继续前进 - 您知道此时处于糟糕的状态,并且您知道为什么,运行剩余代码的意义是什么当该方法可能依赖于断言告诉您的数据不是您想要的时,请使用该方法。OP的问题是有效的,你误解了它。 (3认同)
  • @迈克尔彼得森。+12。它不仅没有帮助,而且完全是错误的。至少在许多第一批 NUnit 框架的背景下是这样。当断言失败时,您将停止该测试实例。无论如何,你不会只是为了看看坏车能行驶多远而继续前进。 (2认同)