在异步回调中XCTAssert / XCTFail是否安全?

时间:2018-07-20 03:30:20

标签: ios objective-c swift xctest

我经常看到一些示例,其中在理论上等待期望的同时,在调用的回调中使用XCTAssertXCTFail。如果超时到期,会发生什么?

一个人为的示例(可以在Swift中随意考虑,它应该是相同的):

XCTestExpectation *expectation = [self expectationWithDescription:@"..."];

SomethingThatTakes2Seconds(^{
    XCTFail(...);
    [expectation fulfill];
}];

[self waitForExpectationsWithTimeout:1 handler:^(NSError *error) {
    ...
}];

在这种情况下,我们将在1秒后达不到期望值,然后XCTFail将在第二秒后达到目标。有明确的行为吗?在我的测试中,随着过程的结束,它似乎只是被忽略了。

但是,如果我进行大量测试,由于包含XCTFail的块在运行时被调用(假设它也是一个异步测试,它将允许队列运行和运行),测试以后是否会不确定地失败?这样)?

使用__block变量并在外部测试方法主体中进行所有声明似乎是正确的做法?

2 个答案:

答案 0 :(得分:0)

在Objective-C中,XCTFail只是一个宏,最终可以扩展为:

// XCTestAsserionsImpl.h
XCT_EXPORT void _XCTFailureHandler(XCTestCase *test, BOOL expected, const char *filePath, NSUInteger lineNumber, NSString *condition, NSString * __nullable format, ...) NS_FORMAT_FUNCTION(6,7);

因此,即使执行了XCTFail,上下文(文件和行号)仍会保留在故障报告中。对于完全不同的测试用例,您不会遇到意外失败。

此外,我怀疑:当您的XCTFail在另一个成功的测试用例场景中执行时,它不会使Xcode显示该测试用例已经失败。尽管我不了解_XCTFailureHandler在内部的工作方式,但是我经常看到Xcode在运行测试时编辑测试文件时无法标记测试用例的成功和失败。简而言之,我的观察使我相信失败是基于源代码的位置,而Xcode仅基于源代码提供了所有不错的标记-当您随便摆弄这些文件时,它可能会感到困惑。

简而言之,我相信(!)延迟失败,即使在拆除后还是执行了,也不会影响其他测试用例。

不过,我希望看到您进行了详细的实验,以验证我的主张。 :)

答案 1 :(得分:-1)

何时

[self waitForExpectationsWithTimeout:1 handler:^(NSError *error) {
        ...
    }];
达到

的情况下,测试跑步者将暂停。直到达到期望为止,测试跑步者将不会继续运行。在这种情况下,由于超时为1,因此等待1秒钟后测试将失败。