Тест пользовательского интерфейса xcode 7.3 случайным образом проходит или не проходит

Я просто практиковался в TDD и написал очень простую функцию для тестирования приложения. Пользовательский интерфейс прост: изначально у него есть кнопка с заголовком «0». В моем контроллере представления у меня есть локальная переменная "score". Каждый раз, когда я нажимаю кнопку, это увеличивает «счет». Заголовок кнопки будет обновлен новым значением «оценки». Логика обновления пользовательского интерфейса кнопки находится в обозревателе свойств «didSet» «score».

Все круто, кроме тестирования пользовательского интерфейса. У меня есть две функции тестирования пользовательского интерфейса: одна — нажать кнопку один раз, а другая — дважды нажать кнопку. Теперь происходит странная вещь. Ниже приведены скриншоты двух моих тестовых функций пользовательского интерфейса.

введите здесь описание изображения

Каждый раз, когда я запускал тест, иногда обе функции проходили, а иногда одна или две из них не срабатывали. Ошибка всегда такая, как показано «Число не равно Числу + 1». Похоже, есть некоторые проблемы со временем ответа. Похоже, что обновление пользовательского интерфейса происходит намного медленнее, чем получение результата метки кнопки. Я не уверен, получу ли я значение button.label слишком рано, прежде чем оно действительно будет обновлено. Должен ли я вообще обновлять пользовательский интерфейс в обозревателях свойств? Есть ли решение пройти тест пользовательского интерфейса? Благодарим за вашу помощь!


person fans3210    schedule 20.05.2016    source источник
comment
Я также пытался очистить проект. Результат теста тот же. Иногда обе тестовые функции проходили, иногда ни одна.   -  person fans3210    schedule 20.05.2016
comment
TDD с UITests в iOS... Желаю удачи, она вам понадобится   -  person Daniel    schedule 20.05.2016
comment
Спасибо @simpleBob, похоже, у теста пользовательского интерфейса есть некоторые проблемы.   -  person fans3210    schedule 21.05.2016


Ответы (2)


Касательно

обе функции прошли, но иногда одна или две из них не срабатывали

UITest выполняется в отдельном процессе. поэтому, если обновление заголовка кнопки происходит медленнее, чем XCTAsert, произойдет сбой, потому что сравните oldValue с ожидаемым значением

После нажатия кнопки просто подождите, чтобы проверить правильно

используя эту функцию waitForExpectationsWithTimeout(3,nil)

func testTapNumberButtonIncrementScore() {
    let app = XCUIApplication()

    app.buttons["numberButton"].tap()

    waitForExpectationsWithTimeout(3, handler: nil)
    XCTAssertEqual(app.buttons["numberButton"].title, "1")
}

func testTapNumberButtonTwiceIncrementTo2() {
    let app = XCUIApplication()

    app.buttons["numberButton"].tapWithNumberOfTaps(2, numberOfTouches: 1)
    waitForExpectationsWithTimeout(3, handler: nil)
    XCTAssertEqual(app.buttons["numberButton"].title, "2")
}

Я надеюсь, что это сработает для вас :)

person Cruz    schedule 20.05.2016
comment
Спасибо @SwiftyCruz. Я приму этот ответ, как только обнаружу, что он работает для всех моих других случаев. Надеюсь, Apple расскажет больше о тестах пользовательского интерфейса на предстоящей конференции WWDC. - person fans3210; 21.05.2016
comment
Извините, @SwiftyCruz, я думаю, что столкнулся с проблемой после использования waitForExpectationsWithTimeout: нарушение API, вызов ожидания без установки каких-либо ожиданий. Я думаю, что мы должны сделать 'expectationForPredicate' перед любым ожиданиемForExpectationsWithTimeout - person fans3210; 23.05.2016

У меня была такая же проблема в симуляторе, а на моем iPhone тест прошел.

В итоге я добавил задержку для симулятора следующим образом:

struct Platform {
    static let isSimulator: Bool = {
        var isSim = false
        #if arch(i386) || arch(x86_64)
            isSim = true
        #endif
        return isSim
    }()
}

class YourUITests: XCTestCase {
    override func setUp() {
        super.setUp()
        if Platform.isSimulator {
            sleep(1)
        }
    }
}

Надеюсь, это поможет.

person ADG    schedule 29.05.2016