Upload
mailru-group
View
4.211
Download
1
Embed Size (px)
Citation preview
Как мы автоматизируем UI-тестирование
в iOS Почте Mail.Ru
Алексей Халайджи
Отдел iOS разработки Почты Mail.Ru
О докладчике
• Алексей Халайджи
• Закончил МГТУ им. Н.Э. Баумана (ИУ-6)
• Закончил Технопарк Mail.Ru
• Работаю в Mail.Ru с января 2015 года
• Занимаюсь автоматизацией UI-тестирования с лета 2015 года
Расскажу о…
• Роль автоматизированного тестирования в процессе разработки
• Фреймворк для тестирования
• Первоначальное состояние у истоков автоматизации
• История развития нашей инфраструктуры тестирования
• Проблемы при автоматизации и их решения
• Результаты
Роль автоматизированного тестирования
• Снижение нагрузки на команду ручного тестирования
• Проверка всей основной функциональности приложения после каждого изменения проекта
• Замещение ручного регрессионного тестирования
• Устранение повторяющихся багов
Автоматизированное тестирование в Workflow • Задачи в jira для обычных задач • Отдельный Workflow для интеграции с QA-отделом • Возможные стейты задач:
• TO AUTOMATE – при создании. Присутствует описание тест-кейса. Ожидает аппрува команды автоматизации тестирования
• WAITING FOR AUTOMATION – аппрув получен, ожидает автоматизации • IN PROGRESS – ТК находится в процессе автоматизации • AUTOMATED READY – ТК автоматизирован • WON’T BE AUTOMATED – ТК не будет автоматизирован
• Связь с обычными задачами через ссылки • Связь с автоматизированными тестами через ссылки и автоматически
генерируемую документацию
Мы используем MonkeyTalk
• Наиболее стабильный
• Возможность доработки функционала
• Нет более подходящих альтернатив
• BDD
• Есть визуальная IDE с возможностью записи действий пользователя
Компоненты MonkeyTalk
• IDE
• Java-обработчик команд
• Статическая библиотека с прослушивающим команды веб-сервером
Особенности синтаксиса
• BDD
• Вид команды: • <Тип компонента> <Идентификатор> <Действие> [<Аргументы>
<Модификаторы>]
• Напр., Button Login_button Tap View Hello_user WaitFor 25 %thinktime=5000
• Вызов кода приложения • App MRUITHelper Exec stubMethod
• App MRUITHelper ExecAndReturn result getResultForString “string”
Первоначальное состояние у истоков автоматизации • ТК пишет команда QA
• Автоматизация тестов через IDE+record
• Автоматизация разработчиками и отделом QA
• В результате: ~50 UI-тестов, выполняемых за 1.5 часа
1. Общие проблемы
• Мало документации
• Мало примеров
• Все баги и улучшения приходится допиливать самим
• Мало обсуждений на stackoverflow.com
• Нет поддержки с лета 2015 года
”I got a new master now…”
- The Genie
Но…
• Мы имеем доступ к открытому коду MonkeyTalk
• Сами можем править баги
• Можем дописывать новый функционал
• Не зависим от других разработчиков
• Быстрая реакция на возникающие проблемы
2. Локализация
• IDE использует надписи на элементах, напр.: Button “Sign In” Tap
• Не устойчиво к смене языка на симуляторе
• Не устойчиво к смене перевода локализуемой строки
• Изменение перевода ведёт к изменению команды во всех тестах
Использование идентификаторов
• Использование accessibilityIdentifier вместо строк, напр.: Button [signin-button] Tap
• Проверка локализации через хелперы, напр.: App LocalizationHelper ExecAndReturn localizedText localizedStringForId sign_in_button_text Button [signin-button] Verify ${localizedText} .text
3. Нестабильное прохождение тестов
• Нестабильность может быть вызвана: • Долгая загрузка симулятора
• Долгий старт приложения на симуляторе
• «Тормоза» тестирующей машины
• Долгая загрузка тела письма при прочтении
• Использование хелперов без ожидания
• …
• Много повторов тестов
• Много false-negative результатов
Повышение стабильности
• Ручное выставление задержек (не круто!)
• Привязка по возможности к элементам (напр., ProgressHUD)
• Патчинг MonkeyTalk для ожидания элементов при вызове хелперов, напр.: App ExecAndReturn result validateView [emails][0] %waitfor=[folderTitle]
Снижение времени ожидания
• Разделение на папки по функциональности (напр., auth, compose, …)
• Примерно одинаковое число тестов в папке
• Упал один тест категории – остальные не запускаем
• Запуск категорий на отдельных машинах
• Система нотификаций: • Упала категория -> сообщение об ошибке категории • Все категории прошли -> Сообщение об успехе прохождения тестов
• Результат: параллельное выполнение 5-6 категорий по 20 тестов за 40 минут
5. Взаимодействие с iOS
• Контроль запуска и очистки симулятора
• Контроль запуска приложения
• Последовательное увеличение таймаута запусков
• Влияние на запуск приложения (например, по пушу)
• Сворачивание и перезапуск приложения
Блок описания теста
• В каждом тесте есть блок док. описания. Он состоит из следующих пунктов: • Обязательные
• Tasks – списки jira id задач • Name - название теста • Сategory – название категории • Description – краткое описание теста
• Необязательные • Args – аргументы • Utils – аргументы для инфраструктуры запуска тестов • Runtime – версия ОС, на которой нужно запускать тест
• По описанию автоматически может быть сгенерирована документация • Проверка наличия всех обязательных блоков проводится
автоматически
Влияние на запуск приложения
• С помощью аргументов
• В приложении есть хелпер для работы с аргументами запуска приложения
• В load методах необходимая функциональность включается/эмулируется
• Так же может быть использован method swizzling (то есть замена реализации метода для его сигнатуры).
Suite
• Отличается от suite в привычном понимании MT – это не последовательность
• MT Suite – это совокупность тестов, выполняемых последовательно вне зависимости от результата их выполнения с формированием общего отчёта
• MT Suite реализован нами в общей инфраструктуре запуска тестов • Suite – последовательность тестов:
• Требующих перезапуска приложения • При падении одного теста перезапускается весь suite целиком • Есть отдельный файл описания docs_suite • Есть наследование аргументов из docs_suite в тестах suite • Перезапуск приложения реализован через перезапуск симулятора без его
очистки
Перезапуск и сворачивание/разворачивание приложения
• Перезапуск реализован через suite
• Для сворачивания/разворачивания приложения и ряда других функций используем private API
• Так как тестовая сборка собирается только локально и никуда не отправляется, то private API использовать можно
• Патчинг MT, чтобы принимающий сервер библиотеки не останавливался при сворачивании приложения
• Пример вызовов из тестов: App MRUITHelper Exec suspendApp App MRUITHelper Exec wakeApp
6. Повторное использование кода
• Много тестов имеют одинаковые участки кода, например авторизацию
• MT позволяет запускать отдельные файлы как команду. Например: Script Login.mt Run login password
• При иерархической структуре файлов тестов требуется много симлинков
• Не хватает стандартного механизма запуска отдельных тестов как команд
Использование JS
• Помимо BDD-описания тестов MT позволяет использовать JS
• Возможность создания библиотеки для обработки конкретных элементов
• Использование Page Object подхода
• Использование возможностей языка: ООП, циклы, функции…
7. Работа с сетью
• Одно из требований к тестам - изолированность • Тесты не могут влиять на исполнение друг друга
• При работе с сетью меняется состояние на сервере, напр. прочитанность письма
• Если тест упал, но не вернул состояние сервера, то он влияет на остальные тесты
• Тесты разных задач выполняются параллельно на разных машинах
Стаббинг сетевых запросов
• Использование NSURLProtocol для перехватывания запросов по определённым URL
• Работа через IMAP реализована через специальный прокси
• Возможности: • Добавление обработчиков с помощью хелперов из теста • Подмена ответов на сетевые запросы • Проверки наличия запросов и их количества • Добавление обработчиков с помощью аргументов запуска теста (напр,
для эмуляции отсутствия сети) • Возможность добавления фильтров на IMAP-запросы в прокси из теста и
через аргументы
8. Запуск тестов для разных почтовых протоколов • Задача:
• Есть ~250 тестов • Они работают по JSON API через NSURLProtocol • Множество тестов нужно запускать также и на IMAP
• Решение: • Используется специальный аргумент в док. описании теста alt_args_cases • Позволяет запускать один и тот же тест с каждым из параметров из
набора • Эти аргументы совмещаются с args • Для IMAP-тестов можно добавить аргумент IMAPMode и обрабатывать
его отдельно в хелперах • Тесты расширить добавлением фильтров для IMAP-прокси
9. Всё равно очень долго
• Категорий около 15
• Машин около 8
• Всего тестов около 300
• Суммарное время тестирования одной задачи без очередей на машины ~2 часа
Распараллеливание запуска тестов на одной машине • Для каждого теста с аргументами создаётся свой уникальный id и
симулятор
• Задаётся максимальное количество одновременно запускаемых симуляторов
• Каждый симулятор запускает MT-сервер на отдельном порту
Разбиение тестов по машинам
• Использование вместо папок тегов из док. описания для деления тестов на группы
• Использование статистики времени выполнения тестов для разделения тестов на группы, выполняющиеся на разных машинах
• Выполняются все тесты вне зависимости от падения одного в группе
• Новая система нотификаций • Результаты всех групп объединяются
• Формируется общий отчёт
• Разработчикам приходит нотификация со ссылкой на отчёт
• В результате: 400 тестов за 45 минут
• От 50 нестабильных тестов за 90 минут
• До 400 стабильных за 45 минут
• Система нотификаций
• Композитная инфраструктура управления запуском тестов и групп тестов (suite)
• Статистика выполнения тестов
• Библиотека Page Object-ов и общих JS-функций и ObjC-хелперов
Результаты автоматизации за год