XCTAssertTrue不会停止例行程序

时间:2014-05-24 14:05:10

标签: xcode unit-testing xcode5

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

- (void)testTest
{
    XCTAssertTrue(false, @"boo");
    NSLog(@"still running");
}

我不知道这有什么用处,因为在满足前提条件时,后续代码通常会崩溃:

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

    for (int i=0; i<vec1.size(); i++) {
        XCTAssertTrue(vec1[i] == vec2[i]);
    }
}

3 个答案:

答案 0 :(得分:10)

您可以更改XCTAssert<XX>的此行为 在设置方法中,将值self.continueAfterFailure更改为NO。

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

答案 1 :(得分:0)

是的,这是有目的的。这就是单元测试的工作原理。未通过测试不会终止测试;它只是没有通过测试(并报告它)。这很有价值,因为你不想因为一次测试失败而不知道你的其他测试是否通过了。

如果(正如你在你的补充中所说的那样)测试方法然后继续抛出一个异常,然后抛出一个异常 - 你知道为什么。但是这个例外被抓住了,那么问题是什么呢?其他测试方法仍在运行,因此您的结果仍然是您所期望的:一种方法未通过测试然后停止,其他测试无论他们做什么。然后,您将在日志中看到类似的内容:

Executed 7 tests, with 2 failures (1 unexpected) in 0.045 (0.045) seconds

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

答案 2 :(得分:0)

只是为了澄清,如果测试产生“失败”,那么你是正确的,这个单独的测试仍将继续执行。如果您想要停止该特定测试,则只需return即可。

测试恢复的事实非常有用,因此您不仅可以识别导致测试失败的第一个问题,还可以识别导致测试失败的所有问题。

你说:

  

我不知道这有什么用,因为当前提条件不满足时后续代码会崩溃:

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

    for (int i=0; i<vec1.size(); i++) {
        XCTAssertTrue(vec1[i] == vec2[i]);
    }
}

你的例子具有讽刺意味,因为,是的,如果这两个向量的大小不同,我可以理解你为什么要return,但如果它们的大小相同,那么你的例子的后半部分就是测试是一个完美的例子,说明为什么你可能不希望它在产生故障后停止。

让我们假设矢量大小相同,其中五个项目不相同。让测试报告此测试中的所有五个失败,而不仅仅是第一个失败,这可能会很好。

在审查测试结果时,了解所有失败的原因,而不仅仅是第一个失败的来源,这有时很好。