E2E Testing Fatigue
Антон Кузнецов
MoscowJS 34, 24.11.2016
Обо мне*
2
Антон Кузнецов, 24 года
25 лет в мобильной разработке
30 лет опыта в юриспруденции
Автор канала в Telegram о
путешествиях
Контрибьютор в приватные репо,
а также react-native, appium, webdriverio
*Денис Измайлов был тут
Обо мне
3
Антон Кузнецов
Веб-разработчик в
4
• Электронный сомелье
• Consumer и Enterprise приложения (iOS & Android)
• Только на американский рынок
• Мы знаем что вам стоит выпить
• И чем стоит закусить
Стек
Tipsi
iOS
WEBEnterprise
Android
5
Проблема
Tipsi
iOS
WEBEnterprise
Android
6
Опыт
• 2 js-разработчиков
• 1 Android-разработчик
• 1 Тестировщик
• Набор тестов для Web
• Набор тестов для Android
• Набор утилит для запуска тестов
7
• Все приложение, а не отдельный компонент
• Имитация пользовательского поведения, а не
низкоуровневое тестирование
• Тестирование связки действий, а не в
изолированном компоненте
• Неуверенность vs уверенность
E2E vs Unit
8
• Вчера вы web-разработчик, сегодня вы -
специалист широкого профиля
Зачем это вам?
9
• Вчера вы web-разработчик, сегодня вы —
специалист широкого профиля
• Вчера вы ничего не знали о вашем мобильном
приложении, сегодня — вы даете советы по UX
Зачем это вам?
11
ГИФКА С ТРИНИТИ ПРО СЮЖЕТ С ОБУЧЕНИЕМ
ВОЖДЕНИЯ ВЕРТОЛЕТА
- Пока нет.- Оператор- Тэнк, мне нужна программа управления вертолетом- PROFIT!- Ты умеешь летать на этой штуке?- Погнали!
• Вчера вы web-разработчик, сегодня вы —
специалист широкого профиля
• Вчера вы ничего не знали о вашем мобильном
приложении, сегодня — вы даете советы по UX
• Вчера мобильные разработчики получали больше
вас, сегодня — они ваши помощники…
Зачем это вам?
13
..или ищут другую работу, если вы
14
• Вчера вы web-разработчик, сегодня вы —
специалист широкого профиля
• Вчера вы ничего не знали о вашем мобильном
приложении, сегодня — вы даете советы по UX
• Вчера мобильные разработчики получали больше
вас, сегодня — они ваши помощники
• Ваши возможности могут превзойти ваши
ожидания
Зачем это вам?
16
• Appium vs. Calabash
• Command Line Interface
• Webdriver API vs. Calabash API (Cucumber)
• GUI inspector (Appium.app) vs. CLI inspector
• Низкий порог вхождения vs. Знание Ruby
• Appium имеет большее сообщество
Инструменты
17
• В настоящее время (ноябрь 2016) работает только
с UI Automator (Xcode 7)
• Для XCUITest Framework (Xcode 8) существует
Appium-iOS-Inspector
Ограничения Appium Inspector
20
1. Запускаем Appium
2. Запускаем симулятор
3. Инициализируем запуск тестов
4. Проверяем, что все успешно запущено
5. Прогоняем тесты
Запуск тестов
22
// ..
26 try {
27 // Check Appium
28 await appiumIsRunning(APPIUM_HOST, APPIUM_PORT)
29 console.log(`Appium is running on: ${APPIUM_HOST}:${APPIUM_PORT}`);
30 if (!DEVICE_NAME || !PLATFORM_VERSION) {
31 // Check device
32 const device = await findiOSDevice();
33 console.log(`Found next iOS device: ${device.name}`)
34 DEVICE_NAME = device.name || 'iPhone 5s'
35 PLATFORM_VERSION = device.platformVersion || '10.1'
36 }
37
38 // Initialize Helper
39 await helper.init(/* init props */)
40
41 // Run Tape tests
42 await runTapeTests(TEST_CASES_PATH)
43 } catch (error) {
44 console.log('Error while executing tests:’, error)
45 }
46
47 await helper.release()
48 }())
23
• Вернуться на главный экран
Хэлпер
24
1 export default async function iosBack() {
2 await this.driver
3 .waitForVisible('~Back', 5000)
4 .click('~Back')
5 }
• Вернуться на главный экран
• Генератор кнопок главного экрана
Хэлпер
27
1 const keys = {
2 Nearby: 1,
3 ScanLabel: 2,
4 SearchWines: 3,
5 MyProfile: 4,
6 SocialFeed: 5,
7 Login: 6,
8 Logout: 6,
9 Intro: 7,
10 Orders: 8,
11 };
12
13 export default function createMenuButtonId(id = 1) {
14 const value = typeof id === 'string' ? keys[id] : id;
15 return this.idFromXPath(`
16 //XCUIElementTypeApplication/XCUIElementTypeWindow/
17 XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/
18 XCUIElementTypeOther/XCUIElementTypeOther/
19 XCUIElementTypeOther/XCUIElementTypeOther/
20 XCUIElementTypeOther/XCUIElementTypeOther/
21 XCUIElementTypeCollectionView/XCUIElementTypeCell[${value}]
22 `)
23 }
• Вернуться на главный экран
• Генератор кнопок главного экрана
• Логин / Логаут
Хэлпер
29
• Вернуться на главный экран
• Генератор кнопок главного экрана
• Логин / Логаут
• Выставить локейшен через приложение
• Обойти длинный список (свайп + сбор данных)
• Найти кнопку DONE на клавиатуре
Хэлпер
31
• Стартовая точка — главный экран
• Тестовый набор атомарен
• Он должен сам о себе позаботиться
• Не использовать метод .pause()
• Ну, можно, но только в особенном случае
• Использовать повсеместно .waitForVisible()
Договоренности
32
• Тесты идут долго
• Держите текст сценария на русском языке
• Пройдитесь по нему с помощью Appium Inspector
• Смело используйте async/await внутри try/catch
• При необходимости пишите видео тестов
• Это все прекрасно работает внутри CI
33
О чем еще стоит знать?
• Тестирование — это, как правило, боль.
• Но, как и в спорте, боль — это лишь этап.
• В итоге это колоссальный опыт для вас.
• Почти все поддается автоматизации.
• Даже оплата через Pay.
• Тестирование — это способ немного отдохнуть от
разработки новых фич и укрепить существующие
Выводы
34
Кузнецов Антон
@isnifer everywhere :)
Вопросы?
Спасибо

E2E-тестирование мобильных приложений

  • 1.
    E2E Testing Fatigue АнтонКузнецов MoscowJS 34, 24.11.2016
  • 2.
    Обо мне* 2 Антон Кузнецов,24 года 25 лет в мобильной разработке 30 лет опыта в юриспруденции Автор канала в Telegram о путешествиях Контрибьютор в приватные репо, а также react-native, appium, webdriverio *Денис Измайлов был тут
  • 3.
  • 4.
    4 • Электронный сомелье •Consumer и Enterprise приложения (iOS & Android) • Только на американский рынок • Мы знаем что вам стоит выпить • И чем стоит закусить
  • 5.
  • 6.
  • 7.
    Опыт • 2 js-разработчиков •1 Android-разработчик • 1 Тестировщик • Набор тестов для Web • Набор тестов для Android • Набор утилит для запуска тестов 7
  • 8.
    • Все приложение,а не отдельный компонент • Имитация пользовательского поведения, а не низкоуровневое тестирование • Тестирование связки действий, а не в изолированном компоненте • Неуверенность vs уверенность E2E vs Unit 8
  • 9.
    • Вчера выweb-разработчик, сегодня вы - специалист широкого профиля Зачем это вам? 9
  • 11.
    • Вчера выweb-разработчик, сегодня вы — специалист широкого профиля • Вчера вы ничего не знали о вашем мобильном приложении, сегодня — вы даете советы по UX Зачем это вам? 11
  • 12.
    ГИФКА С ТРИНИТИПРО СЮЖЕТ С ОБУЧЕНИЕМ ВОЖДЕНИЯ ВЕРТОЛЕТА - Пока нет.- Оператор- Тэнк, мне нужна программа управления вертолетом- PROFIT!- Ты умеешь летать на этой штуке?- Погнали!
  • 13.
    • Вчера выweb-разработчик, сегодня вы — специалист широкого профиля • Вчера вы ничего не знали о вашем мобильном приложении, сегодня — вы даете советы по UX • Вчера мобильные разработчики получали больше вас, сегодня — они ваши помощники… Зачем это вам? 13
  • 14.
    ..или ищут другуюработу, если вы 14
  • 16.
    • Вчера выweb-разработчик, сегодня вы — специалист широкого профиля • Вчера вы ничего не знали о вашем мобильном приложении, сегодня — вы даете советы по UX • Вчера мобильные разработчики получали больше вас, сегодня — они ваши помощники • Ваши возможности могут превзойти ваши ожидания Зачем это вам? 16
  • 17.
    • Appium vs.Calabash • Command Line Interface • Webdriver API vs. Calabash API (Cucumber) • GUI inspector (Appium.app) vs. CLI inspector • Низкий порог вхождения vs. Знание Ruby • Appium имеет большее сообщество Инструменты 17
  • 20.
    • В настоящеевремя (ноябрь 2016) работает только с UI Automator (Xcode 7) • Для XCUITest Framework (Xcode 8) существует Appium-iOS-Inspector Ограничения Appium Inspector 20
  • 22.
    1. Запускаем Appium 2.Запускаем симулятор 3. Инициализируем запуск тестов 4. Проверяем, что все успешно запущено 5. Прогоняем тесты Запуск тестов 22
  • 23.
    // .. 26 try{ 27 // Check Appium 28 await appiumIsRunning(APPIUM_HOST, APPIUM_PORT) 29 console.log(`Appium is running on: ${APPIUM_HOST}:${APPIUM_PORT}`); 30 if (!DEVICE_NAME || !PLATFORM_VERSION) { 31 // Check device 32 const device = await findiOSDevice(); 33 console.log(`Found next iOS device: ${device.name}`) 34 DEVICE_NAME = device.name || 'iPhone 5s' 35 PLATFORM_VERSION = device.platformVersion || '10.1' 36 } 37 38 // Initialize Helper 39 await helper.init(/* init props */) 40 41 // Run Tape tests 42 await runTapeTests(TEST_CASES_PATH) 43 } catch (error) { 44 console.log('Error while executing tests:’, error) 45 } 46 47 await helper.release() 48 }()) 23
  • 24.
    • Вернуться наглавный экран Хэлпер 24
  • 25.
    1 export defaultasync function iosBack() { 2 await this.driver 3 .waitForVisible('~Back', 5000) 4 .click('~Back') 5 }
  • 27.
    • Вернуться наглавный экран • Генератор кнопок главного экрана Хэлпер 27
  • 28.
    1 const keys= { 2 Nearby: 1, 3 ScanLabel: 2, 4 SearchWines: 3, 5 MyProfile: 4, 6 SocialFeed: 5, 7 Login: 6, 8 Logout: 6, 9 Intro: 7, 10 Orders: 8, 11 }; 12 13 export default function createMenuButtonId(id = 1) { 14 const value = typeof id === 'string' ? keys[id] : id; 15 return this.idFromXPath(` 16 //XCUIElementTypeApplication/XCUIElementTypeWindow/ 17 XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/ 18 XCUIElementTypeOther/XCUIElementTypeOther/ 19 XCUIElementTypeOther/XCUIElementTypeOther/ 20 XCUIElementTypeOther/XCUIElementTypeOther/ 21 XCUIElementTypeCollectionView/XCUIElementTypeCell[${value}] 22 `) 23 }
  • 29.
    • Вернуться наглавный экран • Генератор кнопок главного экрана • Логин / Логаут Хэлпер 29
  • 31.
    • Вернуться наглавный экран • Генератор кнопок главного экрана • Логин / Логаут • Выставить локейшен через приложение • Обойти длинный список (свайп + сбор данных) • Найти кнопку DONE на клавиатуре Хэлпер 31
  • 32.
    • Стартовая точка— главный экран • Тестовый набор атомарен • Он должен сам о себе позаботиться • Не использовать метод .pause() • Ну, можно, но только в особенном случае • Использовать повсеместно .waitForVisible() Договоренности 32
  • 33.
    • Тесты идутдолго • Держите текст сценария на русском языке • Пройдитесь по нему с помощью Appium Inspector • Смело используйте async/await внутри try/catch • При необходимости пишите видео тестов • Это все прекрасно работает внутри CI 33 О чем еще стоит знать?
  • 34.
    • Тестирование —это, как правило, боль. • Но, как и в спорте, боль — это лишь этап. • В итоге это колоссальный опыт для вас. • Почти все поддается автоматизации. • Даже оплата через Pay. • Тестирование — это способ немного отдохнуть от разработки новых фич и укрепить существующие Выводы 34
  • 35.
    Кузнецов Антон @isnifer everywhere:) Вопросы? Спасибо