Slide 1

Slide 1 text

UI-тесты для iOS. XCTest. Page Object. Local mock server

Slide 2

Slide 2 text

2 Что такое XCTest? XCTest - фреймворк для написания тестов, интегрированный в Xcode Unit ui perfomance

Slide 3

Slide 3 text

3 1. Не нужно устанавливать дополнительные компоненты. Достаточно установить Xcode версии 7 или выше 2. Скорость 3. Test Recorder 4. Поддержка tvOS Почему XCTest?

Slide 4

Slide 4 text

XCTest API

Slide 5

Slide 5 text

5 XCUIApplication Класс, являющийся прокси между тестами и приложением

Slide 6

Slide 6 text

6 e.g. let app = XCUIApplication(bundleIdentifier:"com.apple.MobileAddressBook") ///Запустить приложение “Контакты” app.launch() ///Убить приложение “Контакты” app.terminate()

Slide 7

Slide 7 text

7 Tests Simulator Device App Я, у которого нет доступа к коду приложения XCUIApplication(bundleIdentifier: "app.bundle.id")

Slide 8

Slide 8 text

8 XCUIElement Класс, который обеспечивает взаимодействие с UI-элементами на экране приложения

Slide 9

Slide 9 text

9 1. Label 2. Accessibility identifier Как обратиться к элементу из теста?

Slide 10

Slide 10 text

10

Slide 11

Slide 11 text

11 Текст /// Заголовок экрана app.staticTexts["title"]

Slide 12

Slide 12 text

12 Текстовое поле /// Поле логина app.textFields["email"]

Slide 13

Slide 13 text

13 Защищенное поле /// Поле пароля app.secureTextFields["password"]

Slide 14

Slide 14 text

14 Кнопка /// Кнопка "Войти" app.buttons["login"]

Slide 15

Slide 15 text

15 1. XCTAssert (XCTAssertTrue) / XCTAssertFalse 2. XCTAssertEqual / XCTAssertNotEqual 3. XCTAssertNil / XCTAssertNotNil Asserts

Slide 16

Slide 16 text

16 e.g. XCTAssert(loginButton.exists) /// true XCTAssertFalse(loginButton.isEnabled) /// true

Slide 17

Slide 17 text

Page Object

Slide 18

Slide 18 text

18 Что такое Page Object? Список элементов экрана и действий, которые совершаются над этими элементами

Slide 19

Slide 19 text

19 e.g. class LoginScreen { /// Заголовок экрана var title: XCUIElement { return app.staticTexts["title"] } /// Поле логина var loginField: XCUIElement { return app.textFields["email"] } /// Поле пароля var passwordField: XCUIElement { return app.secureTextFields["password"] } /// Кнопка "Войти" var loginButton: XCUIElement { return app.buttons["login"] } /// Кнопка Помощь var helpButton: XCUIElement { return app.buttons["ic16DpInfoPurple"] } func fillLogin(login: String) -> LoginScreen { loginField.tap() loginField.typeText(login) return self } func fillPassword(password: String) -> LoginScreen { passwordField.tap() passwordField.typeText(password) return self } }

Slide 20

Slide 20 text

20 UI-test case Test Base App Proxy for tests Common test functions Screen Base Common screen elements Page Objects

Slide 21

Slide 21 text

Local mock server. Catbird

Slide 22

Slide 22 text

22 1. Надежность 2. Скорость 3. Независимость от бэка Почему локальный мок?

Slide 23

Slide 23 text

23 1.Локальный мок 2.Статичный мок 3.Перезапись моков Catbird

Slide 24

Slide 24 text

24 APPLICATION Tests API Тесты без мока

Slide 25

Slide 25 text

25 Tests Application API Тесты с моком

Slide 26

Slide 26 text

26 https://github.com/RedMadRobot/catbird Пользуемся и ставим звездочки

Slide 27

Slide 27 text

Result

Slide 28

Slide 28 text

28 func testInvalidCredentials() { addMock(LoginMock.auth_401_invalid_credentials) step(“Попробовать авторизоваться") { loginScreen.login(login: “[email protected]", password: “1234567890") assertion("Проверить, что отобразилась ошибка") { assertElementAppears(loginScreen .errorInvalidCredentials) } } } Test example

Slide 29

Slide 29 text

Спасибо за внимание!