⚠️ Attention: В текущем документе нет вопросов по Swift, их вы можете легко найти на других ресурсах. Здесь вопросы и кейсы по XCUITest
Какие версии iOS поддерживают XCTest?
XCTest поддерживает iOS 10 и выше и XCode версии 7.2 и вышеКакие типы тестов можно написать используя XCTest?
XCTest позволяет написать: unit, ui и perfomance тестыКак "под капотом" работает XCUITest?
Когда мы добавляем ui-тесты в проект Xcode, они находят в отдельном таргете с препиской UITest. Это связано с тем, что ui-тесты компилируются и развертываются в отдельном приложении. Код ui-тестов, который мы пишем, выполняется в приложении для запуска тестов, а не в целевом приложении. Приложение для выполнения тестов действует как прокси, оно берет написанную тестовую логику и транслирует её в iOS Accessibility actions, которые выполняет с целевым приложением. Это делается для имитации использования приложения так же, как это делает человек. С точки зрения разработчика это означает, что мы не взаимодействуем напрямую с элементами UIKit в нашем приложении, такими как UILabel или UIButton, а скорее через прокси-элементы, называемые XCUIElement.По каким признакам xcode автоматически добавляет автотесты в таргет?
Класс в котором находится тест должен наследоваться от XCTestCase
Тестовый метод должен быть: без параметров, без возвращаемого значения и с именем, начинающимся со слова test в нижнем регистре
В чем различие между accessibilityidentifier и accessibilitylabel
accessibilityidentifier - Это строка идентифицирующая ui-элемент, используется в ui-тестах
accessibilityLabel - Это краткое описание содержимого в элементе, например текст на кнопке, используется в Voice over
Как задать предусловие и постусловие для автотеста?
С помощью setUp()
и tearDown()
методов. Также мы можем задавать эти условия для всего сьюта тестов либо отдельно для каждого теста.
Какие бывают ожидания и как реализовать их в XCTest?
Ожидания бывают двух видов явные и неявные.
Неявные ожидания можно реализовать несколькими способами:
wait(for expectations: [XCTestExpectation], timeout seconds: TimeInterval)
;waitForExistence(timeout:)
.
Явное ожидание можно реализовать - Thread.sleep(forTimeInterval: 1)
Какой класс отвечает за поиск элемента в приложении и по каким признакам можно искать элемент?
За поиск UI-элементов отвечает класс XCUIElementQuery. Элемент можно искать по:
- по индефикатору, самый надежный вариант поиска.
- по индексу типа элемента(например вторая кнопка на экране).
- по вложенности(children и descedants).
- по предикату.
Для чего нужны тест планы в XCTest?
Тест план предоставляет возможность запускать наборы тестов с различными конфигурациями. Тест план — это JSON файл с расширением .xctestplan, которым можно управлять через пользовательский интерфейс или из исходного кода. Его удобно использовать, когда у вас есть несколько наборов тестов: Smoke, Rregression или группы тестов которые должны гонять на разных локализациях или с разной геолокациейКак сбросить permissions при запуске тестов?
Чтобы сбросить permissions, нужно вызвать метод resetAuthorizationStatus и передать в него значение из enum XCUIProtectedResourceМожно ли запустить сторонее приложение из теста? Например Safari
Да можно. Для этого нужно знать bundle id приложения и передать его в качестве аргумента в XCUIApplication.
Пример XCUIApplication(bundleIdentifier: "com.apple.mobilesafari").launch()
Какие ты знаешь нативные и не нативные фреймворки реализации автотестов? И какие у них плюсы/минусы
Основная нативная библиотека для iOS - это XCTest, также можно воспользоваться фреймворками Earlgrey, Kif, Calabash.Не нативный фреймворк - Appium.
Критерий | XCTest | Appium |
---|---|---|
Язык | Swift/Objective-C | Любой |
Стабильность тестов | Более стабильные | Менее стабильные |
Кросплатформенность | Нет | Да |
Скорость | Быстрее | Медленее |
Доступ к коду приложения | Нужен | Не нужен |
Можно ли взаимодействовать с симулятором из командной строки?
Да для взаимодействия есть утилита от apple - simctlКак можно ускорить прогон автотестов?
Для ускорения тестов можно воспользоваться:
- параллелизацией ui-тестов;
- стартовать флоу с нужного экрана;
- убрать дублирущие проверки в сценариях, если они есть;
- перевести тесты на моки;
- запускать тесты без сборки приложения, а на основании derived data
Нужно улучшить текущий отчет об автотестах, что можно туда добавить и как будешь это реализовывать?
В отчет можно добавить:
- запись видео прогона теста;
- логи сетевых запросов;
- сделать более информативные вывод в ассертах;
- разбить сценарий на шаги, используя XCTContext
Как работает snapshot тестирование,как его можно реализовать?
Snapshot тесты - это тесты которые делают скриншот экрана (эталонный скриншот) и сравнивают с актуальным скриншотом, который делается во время прогона тестов.Для реализации этого вида тестирование в iOS, есть две библиотеки: iOSSnapshotTestCase (previously FBSnapshotTestCase), SnapshotTesting.
При реализации нужно будет обрезать status bar дабы он не аффектил результаты прогона теста
Нужно реализовать свайп до нижнего элемента в таблице с скролом, как будешь это реализовывать?
При реализации метода учесть ограничение на кол-во свайпов и видимость элемента на экране
Дать кандидату плохо написанный автотест и спросить что можно исправить.
Данный документ будет пополняться. Если у вас есть интересные вопросы/кейсы, которыми можно дополнить этот документ, закидывайте их в Pull request