Время ожидания XCTWaiter.wait () иногда кажется больше - PullRequest
0 голосов
/ 09 мая 2018

Чтобы добавить задержки в моих тестах, я реализовал это:

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 Ответ

0 голосов
/ 09 мая 2018

Оказывается, что задержки могут занять значительно больше времени (до 200 мс в этом эксперименте 2011 года: http://atastypixel.com/blog/experiments-with-precise-timing-in-ios/).

При использовании этой функции execute(after:testBlock:) необходимо брать достаточные поля.

...