└── README.md /README.md: -------------------------------------------------------------------------------- 1 | # Интервью на позицию AQA iOS 2 | 3 | > :warning: **Attention**: В текущем документе нет вопросов по Swift, их вы можете легко найти на других ресурсах. Здесь вопросы и кейсы по XCUITest 4 | 5 | 6 | ## Вопросы 7 | 8 |
9 | Какие версии iOS поддерживают XCTest? 10 | XCTest поддерживает iOS 10 и выше и XCode версии 7.2 и выше 11 |
12 | 13 |
14 | Какие типы тестов можно написать используя XCTest? 15 | XCTest позволяет написать: unit, ui и perfomance тесты 16 |
17 | 18 |
19 | Как "под капотом" работает XCUITest? 20 | Когда мы добавляем ui-тесты в проект Xcode, они находят в отдельном таргете с препиской UITest. Это связано с тем, что ui-тесты компилируются и развертываются в отдельном приложении. Код ui-тестов, который мы пишем, выполняется в приложении для запуска тестов, а не в целевом приложении. Приложение для выполнения тестов действует как прокси, оно берет написанную тестовую логику и транслирует её в iOS Accessibility actions, которые выполняет с целевым приложением. Это делается для имитации использования приложения так же, как это делает человек. С точки зрения разработчика это означает, что мы не взаимодействуем напрямую с элементами UIKit в нашем приложении, такими как UILabel или UIButton, а скорее через прокси-элементы, называемые XCUIElement. 21 |
22 | 23 |
24 | По каким признакам xcode автоматически добавляет автотесты в таргет? 25 | 26 | Класс в котором находится тест должен наследоваться от XCTestCase 27 | 28 | Тестовый метод должен быть: без параметров, без возвращаемого значения и с именем, начинающимся со слова test в нижнем регистре 29 |
30 | 31 |
32 | В чем различие между accessibilityidentifier и accessibilitylabel 33 | 34 | accessibilityidentifier - Это строка идентифицирующая ui-элемент, используется в ui-тестах 35 | 36 | accessibilityLabel - Это краткое описание содержимого в элементе, например текст на кнопке, используется в Voice over 37 | 38 |
39 | 40 |
41 | Как задать предусловие и постусловие для автотеста? 42 | 43 | С помощью `setUp()` и `tearDown()` методов. Также мы можем задавать эти условия для всего сьюта тестов либо отдельно для каждого теста. 44 |
45 | 46 |
47 | Какие бывают ожидания и как реализовать их в XCTest? 48 | 49 | Ожидания бывают двух видов явные и неявные. 50 | 51 | Неявные ожидания можно реализовать несколькими способами: 52 | - `wait(for expectations: [XCTestExpectation], timeout seconds: TimeInterval)`; 53 | - `waitForExistence(timeout:)`. 54 | 55 | Явное ожидание можно реализовать - `Thread.sleep(forTimeInterval: 1)` 56 |
57 | 58 |
59 | Какой класс отвечает за поиск элемента в приложении и по каким признакам можно искать элемент? 60 | 61 | За поиск UI-элементов отвечает класс XCUIElementQuery. Элемент можно искать по: 62 | 1. по индефикатору, самый надежный вариант поиска. 63 | 2. по индексу типа элемента(например вторая кнопка на экране). 64 | 3. по вложенности(children и descedants). 65 | 4. по предикату. 66 |
67 | 68 |
69 | Для чего нужны тест планы в XCTest? 70 | Тест план предоставляет возможность запускать наборы тестов с различными конфигурациями. Тест план — это JSON файл с расширением .xctestplan, которым можно управлять через пользовательский интерфейс или из исходного кода. Его удобно использовать, когда у вас есть несколько наборов тестов: Smoke, Rregression или группы тестов которые должны гонять на разных локализациях или с разной геолокацией 71 |
72 | 73 |
74 | Как сбросить permissions при запуске тестов? 75 | Чтобы сбросить permissions, нужно вызвать метод resetAuthorizationStatus и передать в него значение из enum XCUIProtectedResource 76 |
77 | 78 | 79 |
80 | Можно ли запустить сторонее приложение из теста? Например Safari 81 | 82 | Да можно. Для этого нужно знать bundle id приложения и передать его в качестве аргумента в XCUIApplication. 83 | 84 | Пример `XCUIApplication(bundleIdentifier: "com.apple.mobilesafari").launch()` 85 |
86 | 87 |
88 | Какие ты знаешь нативные и не нативные фреймворки реализации автотестов? И какие у них плюсы/минусы 89 | Основная нативная библиотека для iOS - это XCTest, также можно воспользоваться фреймворками Earlgrey, Kif, Calabash. 90 | 91 | Не нативный фреймворк - Appium. 92 | 93 | | Критерий | XCTest | Appium| 94 | | ----------- | ----------- |----------| 95 | | Язык | Swift/Objective-C | Любой | 96 | | Стабильность тестов | Более стабильные | Менее стабильные | 97 | | Кросплатформенность | Нет | Да | 98 | | Скорость | Быстрее | Медленее | 99 | | Доступ к коду приложения | Нужен | Не нужен | 100 | 101 |
102 | 103 |
104 | Можно ли взаимодействовать с симулятором из командной строки? 105 | Да для взаимодействия есть утилита от apple - simctl 106 |
107 | 108 |
109 | Как можно ускорить прогон автотестов? 110 | 111 | Для ускорения тестов можно воспользоваться: 112 | - параллелизацией ui-тестов; 113 | - стартовать флоу с нужного экрана; 114 | - убрать дублирущие проверки в сценариях, если они есть; 115 | - перевести тесты на моки; 116 | - запускать тесты без сборки приложения, а на основании derived data 117 |
118 | 119 |
120 | Нужно улучшить текущий отчет об автотестах, что можно туда добавить и как будешь это реализовывать? 121 | 122 | В отчет можно добавить: 123 | - запись видео прогона теста; 124 | - логи сетевых запросов; 125 | - сделать более информативные вывод в ассертах; 126 | - разбить сценарий на шаги, используя XCTContext 127 |
128 | 129 |
130 | Как работает snapshot тестирование,как его можно реализовать? 131 | Snapshot тесты - это тесты которые делают скриншот экрана (эталонный скриншот) и сравнивают с актуальным скриншотом, который делается во время прогона тестов. 132 | 133 | Для реализации этого вида тестирование в iOS, есть две библиотеки: iOSSnapshotTestCase (previously FBSnapshotTestCase), SnapshotTesting. 134 | 135 | При реализации нужно будет обрезать status bar дабы он не аффектил результаты прогона теста 136 |
137 | 138 | ## Кейсы 139 | 140 |
141 | Нужно реализовать свайп до нижнего элемента в таблице с скролом, как будешь это реализовывать? 142 | 143 | При реализации метода учесть ограничение на кол-во свайпов и видимость элемента на экране 144 |
145 | 146 | 147 |
148 | Дать кандидату плохо написанный автотест и спросить что можно исправить. 149 |
150 | 151 | --- 152 | 153 | ### Примечание 154 | 155 | Данный документ будет пополняться. Если у вас есть интересные вопросы/кейсы, которыми можно дополнить этот документ, закидывайте их в Pull request 156 | --------------------------------------------------------------------------------