我经常看到一些示例,其中在理论上等待期望的同时,在调用的回调中使用XCTAssert
和XCTFail
。如果超时到期,会发生什么?
一个人为的示例(可以在Swift中随意考虑,它应该是相同的):
XCTestExpectation *expectation = [self expectationWithDescription:@"..."];
SomethingThatTakes2Seconds(^{
XCTFail(...);
[expectation fulfill];
}];
[self waitForExpectationsWithTimeout:1 handler:^(NSError *error) {
...
}];
在这种情况下,我们将在1秒后达不到期望值,然后XCTFail
将在第二秒后达到目标。有明确的行为吗?在我的测试中,随着过程的结束,它似乎只是被忽略了。
但是,如果我进行大量测试,由于包含XCTFail
的块在运行时被调用(假设它也是一个异步测试,它将允许队列运行和运行),测试以后是否会不确定地失败?这样)?
使用__block
变量并在外部测试方法主体中进行所有声明似乎是正确的做法?
答案 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秒钟后测试将失败。