Таймаут XCTWaiter.wait(), кажется, иногда дольше
Чтобы добавить задержки в моих тестах, я реализовал это:
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 или 2 раза больше системного такта в 1/60?
1 ответ
Решение
Оказывается, что задержки могут занять значительно больше времени (до 200 мс в этом эксперименте 2011 года: http://atastypixel.com/blog/experiments-with-precise-timing-in-ios/).
Должен брать достаточные поля при использовании этого execute(after:testBlock:)
функция.