XCTWaiter.wait() 超时有时似乎需要更长的时间
XCTWaiter.wait() timeout seems to take longer sometimes
func execute(after: TimeInterval, testBlock: () -> Void) {
let result = XCTWaiter.wait(for: [expectation(description: "Delayed Test")], timeout: after)
if result == XCTWaiter.Result.timedOut {
testBlock()
} else {
XCTFail("Delay interrupted.")
}
}
然后我写了一个测试:
func testExecute() {
var i = 1
DispatchQueue.main.asyncAfter(deadline: .now() + 0.40) {
i = 2
}
execute(after: 0.20) {
XCTAssert(i == 1)
}
execute(after: 0.15) {
XCTAssert(i == 1) // Fails once every three or four runs.
}
execute(after: 0.06) { // Never fails.
XCTAssert(i == 2)
}
}
为什么这一秒 XCTAssert()
经常失败?
这是我模拟器上唯一的 运行。您预计会有一些抖动,但这不应该保持在系统时钟周期 1/60 秒的 1 倍或 2 倍吗?
事实证明,延迟可能会花费相当长的时间(在 2011 年的实验中长达 200 毫秒:http://atastypixel.com/blog/experiments-with-precise-timing-in-ios/)。
使用此execute(after:testBlock:)
功能时必须留有足够的余量。
func execute(after: TimeInterval, testBlock: () -> Void) {
let result = XCTWaiter.wait(for: [expectation(description: "Delayed Test")], timeout: after)
if result == XCTWaiter.Result.timedOut {
testBlock()
} else {
XCTFail("Delay interrupted.")
}
}
然后我写了一个测试:
func testExecute() {
var i = 1
DispatchQueue.main.asyncAfter(deadline: .now() + 0.40) {
i = 2
}
execute(after: 0.20) {
XCTAssert(i == 1)
}
execute(after: 0.15) {
XCTAssert(i == 1) // Fails once every three or four runs.
}
execute(after: 0.06) { // Never fails.
XCTAssert(i == 2)
}
}
为什么这一秒 XCTAssert()
经常失败?
这是我模拟器上唯一的 运行。您预计会有一些抖动,但这不应该保持在系统时钟周期 1/60 秒的 1 倍或 2 倍吗?
事实证明,延迟可能会花费相当长的时间(在 2011 年的实验中长达 200 毫秒:http://atastypixel.com/blog/experiments-with-precise-timing-in-ios/)。
使用此execute(after:testBlock:)
功能时必须留有足够的余量。