XCTestCase - iOS UI Tests - работа с UITableViews со многими ячейками

Я экспериментирую с тестовыми тегами (XCode 7) UI XCTestCase, и я просто наткнулся на проблему с одним UIView, в котором у меня есть UITableView со многими ячейками (4000 +).

Когда приложение работает нормально, отображаются только видимые ячейки и вообще не возникает проблема с производительностью. Однако, если я запустил приложение в контексте записи XCTestCase, и я перехожу к этому экрану, симулятор замерзает, по-видимому, потому что каждая отдельная ячейка отображается так, как если бы она была видимой. Если я попытаюсь выполнить script навигацию вручную, и я запустил XCTestCase, тестовый тест не удался сразу после перехода на этот экран, выход с "ошибкой тестирования пользовательского интерфейса - не удалось получить обновленный снимок", видимо, опять же, потому что все ячейки визуализируются и это не заканчивается вовремя.

Я думаю, что это связано с тем, что тестовая среда создает всю метамодель экрана под дисплеем, добавляя каждую из 4000+ ячеек в иерархию дерева представлений.

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

Есть ли обходной путь для этого? Можно ли как-то пропустить конструкцию части иерархии дерева пользовательского интерфейса или что-то еще? Моя цель - написать UI-тесты для этого экрана.

Ответ 1

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

Возможно, это не то, что вы ищете, но это может помочь другим:

В основном я подсчитываю ячейки в таблице 2 раза подряд, если они не равны, что означает, что таблица по-прежнему загружается. Поместите его в цикл и сделайте это, пока оба счета не возвратят одинаковое число, что означало бы, что таблица закончила загрузку. Затем я останавливаюсь на 30 секунд, так что если это займет больше 30 секунд, тест завершится неудачно (этого было достаточно времени в моем случае). Если ваша таблица займет больше времени, вы можете увеличить число до 180 в течение 3 минут и т.д.

    let startTime = NSDate()
    var duration : TimeInterval
    var cellCount1 : UInt = app.tables.cells.count
    var cellCount2 : UInt = app.tables.cells.count
    while (cellCount1 != cellCount2) {
        cellCount1 = app.tables.cells.count
        cellCount2 = app.tables.cells.count
        duration = NSDate().timeIntervalSince(startTime as Date)
        if (duration > 30) {
            XCTFail("Took too long waiting for cells to load")
        }
    }
    //Now I know the table is finished loading and I can tap on a cell
    app.tables.cells.element(boundBy: 1).tap()

Ответ 2

Для тестов пользовательского интерфейса предлагается использовать структуру UIAutomation или Appium, если вы используете xcode, который меньше версии 7. Если вы используете XCode 7 или выше, используйте новые тесты пользовательского интерфейса. Нажмите кнопку записи и нажмите на конкретную ячейку, на которую вы хотите написать тест пользовательского интерфейса. Это приведет к генерации кода для использования этой конкретной ячейки. Затем вы можете использовать утверждения для выполнения своих тестов.

Подробнее см. видео ниже. https://developer.apple.com/videos/play/wwdc2015-406/