UI-тесты за 2 минуты

UI-тесты за 2 минуты

iOSDeviant

 Все мы знаем, что UI-тесты странная и непонятная вещь, но не все знают, что сделать тесты для проверки большинства функционала можно буквально за пару минут.


Оговорюсь, что это не будет гарантом стабильности работы приложения, но это может послужить хорошим стартом в тестировании. Т.е. просто проверять что и как работает, воспроизводится ли баг и прочие мелкие задачи (для чего посерьёзнее, нужно чего-то посерьёзнее)


Поехали!

Создаем проект и сразу ставим галочку на "Include Tests".

Если проект уже создан, то делаем следующее:

File -> New -> target ... -> UITestingBundle -> Finish

В итоге, получаем вот такой файл, где и будут находится все тесты:


Стартер-пак для UI-тестов готов!
Теперь создадим простенький экран, на который будем добавлять тестики:


Выглядит неплохо, плюс психологи говорят, что акцентирование внимания на желтом цвете улучшает настроение)

Далее, добавим IBOutlet'ы для UIlabel и UIButton и протянем IBAction.

Создадим счетчик, который будет делать +1 к переменной counter и добавим условие - когда counter будет равен 2, кнопка должна быть неактивной (не реагировать на нажатия).

Также добавим нашей кнопке accessibilityIdentifier, чтобы её можно было опознать во время тестов,
Выглядит это так:

Супер, у нас есть приложение! Теперь пора делать тесты!

Для тех, кто сочтет данную задачу слишком абстрактной, приведу пример, где можно встретить такой код.
Делаем приложуху для знакомств, функционал прост - увидел фото, лайкнул, при повторном нажатии на лайк - лайк снимается (как в инсте). Но вот беда, все пользователи такие робкие и неуверенные, что спустя время снимают лайки.
Решаем проблему гениально - убираем возможность отменить лайк повторным нажатием. Соответственно, когда счетчик нажатий на кнопку лайка стал равен 1 - блокируем кнопку.

Итак, переходим в файл с тестами (ProjectNameUITests.swift) и видим заготовку:

Убираем все лишнее, оставив только такой код:

continueAfterFailure = false - означает, стоит ли продолжать делать оставшиеся тесты, когда один провалился (например, есть 5 разных тестов, первый не прошел и вопрос "надо ли делать остальные?").

Ниже, создаем свой тест для кнопки, назовем его testButtonTap().

Будем тестировать единственный функционал, который у нас имеется - после нажатия на кнопку два раза - она должна заблокироваться.

Важно! Все названия тестов должны начинаться со слова test (например, testUserInput, testCutomButtonTapped, testDateSelect).

А теперь, поставим курсор внутри функции (теста) testButtonTap и обратим внимание на красный круг в нижней панели.

При нажатии на него, запустится приложение и внутри функции (теста) testButtonTap будут записываться все взаимодействия пользователя с UI.

Итак, жмем на запись, ждём, когда откроется приложение и кликаем на кнопку два раза, затем еще один раз - контрольный.

Теперь возвращаемся в Xcode и останавливаем запись (на ту же кнопку, где был круг).

В нашей функции появились несколько строк кода, которые зафиксировал Xcode:

let app = XCUIApplication() - cоздается экземпляр приложения.
let buttonStaticText = app.staticTexts["Button"] - берем кнопку с экрана.
buttonStaticText.tap() - действие, нажатие на кнопку.
И последняя, длинная строка - это когда наша кнопка перестала обрабатывать нажатия и просто попыталась взять элемент куда был совершен тык.

Последняя строка нужна просто для того, чтобы мы увидели, что последние нажатие было не обработано кнопкой (т.к. она уже заблокирована). Так что, удаляем её, она тут ни к месту.

Xcode не идеален, поэтому нужно немного изменить строку, где мы получаем ссылку на нашу кнопку. Для это меняем staticTexts на buttons и прописываем значение accessibilityIdentifier, который задали в ViewController'e:


Итак, функция (тест) testButtonTap содержит в себе алгоритм работы с UI, который мы бы хотели проверить. Но где же сама проверка, как понять что все хорошо?
Для этого есть функции XCTAssert - это функции, которые принимают в себя какое-то выражение и определяют прошел тест успешно или нет.
XCTAssert-функции представлены различными вариантами для любых ситуаций:

Сейчас рассмотрим функцию XCTAssertFalse.

Напишем вызов XCTAssertFalse и поместим туда условие, которое хотим проверить. а проверять будем доступность кнопки (нужен именно false, так как ожидается что isEnabled вернет false, что значит, что кнопка заблокирована):

Для запуска теста, нужно открыть панель с тестами, нажав на эту кнопку:

Тут отображает список всех тестов и созданный нами testButtonTap:

Наводим курсор на то место, где у меня красные значки и жмём на появившуюся стрелку.
Собственно, тут можно запускать либо один, конкретный тест, либо все тесты в файле.
Видим ошибку, которая говорит, что Xcode не может воспроизвести нажатие, так как приложение на запущено, исправим это, добавив в testButtonTap запуск приложения:

Запускаем и видим, что все отлично, тесты прошли успешно!

Для проверки, давайте закомментируем строку во ViewController'e с блокировкой кнопки:

Перейдем на вкладку с тестами, запустим и увидим failed:

Вот и всё! Для тестирования некоторых UI-багов этого вполне достаточно, но стоит отметить, что это лишь вершина айсберга и для более глубинных ситуаций, нужны более глубокие средства.

Report Page