Автоматическое тестирование мобильных приложений на основе скриншотов Сергей Борисов, tech lead, ТомскСофт Иван Лебедев, интерн, ТомскСофт
2 Сергей Борисов В настоящее время: - Руководитель проекта в ТомскСофт - ст. преп-ль в ТУСУР, каф. КСУП Ранее: - MobilTeck - SiberLogic - ЭлеСи - ТМЦДО ТУСУР - НИИ АЭМ Общий стаж в разработке ПО: 19 лет Общий стаж в высшем образовании: 15 лет Об авторах
3 Иван Лебедев В настоящее время: - Интерн в ТомскСофт - студент 5-го курса ТУСУР, каф. КСУП Об авторах
4 Суть проблемы 1. Приложения обладают UI (особенно мобильные)
5 Суть проблемы 2. UI включает множество различных элементов с разным форматированием
6 Суть проблемы 3. Зоопарк различных разрешающих способностей
7 Суть проблемы 3. Зоопарк различных разрешающих способностей 120 точек на дюйм160 точек на дюйм240 точек на дюйм320 точек на дюйм Маленький240x320480x640 Нормальный 240x x x x x x x960 Большой 480x x x x x1024 Очень большой1024x x x x x x x x x x1600
8 Суть проблемы 4. Зоопарк соотношений экрана
9 Тестирование Если вы разрабатываете приложение по принципу: сделали – отдали – забыли, то вам не нужно тестирование Если вы разрабатываете приложение, которое собираетесь развивать и поддерживать, то вам нужно тестирование
10 Классификация тестирования: объект тестирования Функциональное тестирование (functional testing) Тестирование производительности (performance testing) Юзабилити-тестирование (usability testing) Тестирование интерфейса пользователя (UI testing) Тестирование безопасности (security testing) Тестирование локализации (localization testing) Тестирование совместимости (compatibility testing)
11 Классификация тестирования: по времени проведения Альфа-тестирование (alpha testing) Тестирование при приёмке (smoke testing) Тестирование новой функциональности (new feature testing) Регрессионное тестирование (regression testing) Тестирование при сдаче (acceptance testing) Бета-тестирование (beta testing)
12 Автоматизированное тестирование РазработчикиРепозитари й CI сервер
13 Регрессионное автоматическое тестирование Модульные тесты Функциональные интеграционные тесты Тесты UI
14 Тестирование UI
15 Тестирование UI
16 Тестирование UI по элементам – дело занудное Тестирование UI
17 Вопросы на которые может ответить фунциональное тестирование через UI Наличие/отсутствие элемента управления Видимость этого элемента управления Различные другие свойства объекта Корректность реакции элемента управления на действия пользователя
18 Вопросы на которые фунциональное тестирование через UI ответить не может
19 Находится ли элемент управления там, где того ожидал дизайнер?
20 Или с каким конкретным набором данных он выглядит: слишком мелко не полностью и т.д. Выглядит ли элемент управления, так как того ожидал дизайнер?
21 Соответствует ли отображение интерфейса ожиданиям дизайнера? А соответствует ли оно ожиданиям заказчика?
22 На эти вопросы может легко ответить человек Надо всего лишь просмотреть все экраны… Со всеми возможными данными… На всех возможных разрешениях устройств… На всех версиях операционной системы…
23 Объем работы тестировщика
24 Расчетное время Количество экранов для разных наборов данных – 100 Количество разрешений экрана – 5 Время подготовки и изучения одного экрана – 5 минут Итоговое время: 100х5х5=2500мин ~1 неделя Для каждой версии ОС
25 Задача Нужен фреймоворк, который позволяет: Делать автоматическое регрессионное тестирование приложения Учитывать все особенности отображения элементов управления Делать тесты на разных разрешениях экранов и разных версиях операционной системы
26 Решение: шаг 1 Для каждого экрана приложения нужно подготовить наборы тестовых данных, которые будут в нем отображаться Screen2 Screen1DataSet1 DataSet2 DataSet3 …
27 Создать тестовое приложение, которое в автоматическом режиме: Загружает заранее подготовленные данные Отображает экран Делает скриншот этого экрана Примечание : функциональность элементов управления, в данном случае не важна Решение: шаг 2
28 CI сервер 320х х х х х x x x x x1260 … Решение: шаг 3 Screen2 Screen1DataSet1 DataSet2 DataSet3 …..
29 Первая проверка
30 CI сервер 320х х х х х x x x x x1260 … Решение: шаг 4 Screen1 Screen2 DataSet1 DataSet2 DataSet3 …..
31 Последующие проверки ?
32 Что нужно сделать, чтобы это заработало Подготовить данные (БД или другое хранилище) Отвязать UI приложения от сервисов Сделать скриншоты экранов Сравнить два изображения и найти разницу
33 Реализация фреймворка
34 Программная часть (библиотека *.jar) Скриптовая часть Тесты Состав фреймворка
35 Виды тестов в Android Система Android на данный момент позволяет проводить два вида тестирования Activity: Unit-testing тестирование, изолированное от инфраструктуры системы, позволет заменять некоторые объекты системы. Используется класс ActivityUnitTestCase Instrumentational-testing тестирование, использующее реальную инфраструктуру системы, позволяет управлять действиями тестируемой Activity напрямую. Используется класс ActivityInstrumentationTestCase2
36 Состав библиотеки Основные классы: ScreenshotTaker – непосредственно занимается созданием скриншотов Вспомоготельные классы: DatabaseHelper – обнуляет базу данных и заполняет начальными данными DataSetReader – считывает исходные данные из файла Table – обеспечивает промежуточное хранение данных
37 Cхема работы теста compare..
38 Инициализация теста Инициализируем ScreenshotTaker Загружаем данные (если они одинаковые для всех тестов группы)
39 Использовать DBUnit было сложно Разработали свой модуль загрузки данных Поддерживает один из двух форматов DBUnit Загрузка данных в БД приложения
40 Загрузка данных в БД приложения
41 Выполнение скриншота Выполнение скриншота делается внутренними механизмами Android Рассматривался вариант выполнения скриншота хостовой ОС
42 Сравнение скриншотов Сравнение двух изображений построено на базе ImageMagick Различия между двумя скриншотами помечаются
43 Исключение части экрана Интерфейс иногда содержит компоненты, значения которых постоянно меняются, типа часов, прогресс баров и т.д.
44 Строение экрана в Android
45 Метод, создающий скриншоты, принимает следующие агрументы: Activity та активити, скриншот элемента которой будет производиться Int идентификатор элемента, снимок которого будет производиться Int список индетификаторов тех элементов, котороые надо исключить String уникальное имя скриншота, используется в именовании в файловой системе Входные данные метода
46 Создание скриншота Пример вызова функции, где создается скриншот корневого элемента с исключением элемента с идентификатором «contact_progressbar»
47 Алгоритм скрипта сравнения скриншотов Копирование скриншотов с устройства Есть разница с эталонным? Есть ли эталонный? Остались непроверенные скриншоты? нет да нет да нет Начало Конец Генерирование отчета Принять за эталонный Отправить на проверку тестировщику
48 Заключение Был реализован фреймворк для ОС Android, позволяющий тестировать графический интерфейс приложения Планируется реализовать аналогичную систему для iOS, затем для WinPhone8 Исходный код доступен по лицензии Creative Commons Attribution-NonCommercial- ShareAlike 3.0
49 Благодарим за внимание Сергей Борисов, tech lead, ТомскСофт Иван Лебедев, интерн, ТомскСофт