ݺߣ

ݺߣShare a Scribd company logo
Автоматическое тестирование мобильных
   приложений на основе скриншотов


                     Сергей Борисов, tech lead, ТомскСофт
                        Иван Лебедев, интерн, ТомскСофт
Об авторах

Сергей Борисов
В настоящее время:
- Руководитель проекта в ТомскСофт
- ст. преп-ль в ТУСУР, каф. КСУП

Ранее:
- MobilTeck
- SiberLogic
- ЭлеСи
- ТМЦДО ТУСУР
- НИИ АЭМ

Общий стаж в разработке ПО: 19 лет
Общий стаж в высшем образовании: 15 лет


                                          2
Об авторах

Иван Лебедев
В настоящее время:
- Интерн в ТомскСофт
- студент 5-го курса ТУСУР, каф. КСУП




                                          3
Суть проблемы
1. Приложения обладают UI (особенно мобильные)




                                                 4
Суть проблемы
2. UI включает множество различных элементов с разным
форматированием




                                                        5
Суть проблемы
3. Зоопарк различных разрешающих способностей




                                                6
Суть проблемы
3. Зоопарк различных разрешающих способностей

                  120 точек на дюйм   160 точек на дюйм   240 точек на дюйм   320 точек на дюйм


   Маленький      240x320                                 480x640


   Нормальный     240x400             320x480             480x800             640x960
                  240x432                                 480x854
                                                          600x1024

    Большой       480x800             480x800

                  480x854             480x854
                                      600x1024

  Очень большой   1024x600            1280x800            1536x1152           2048x1536
                                      1024x768            1920x1152           2560x1536
                                      1280x768            1920x1200           2560x1600



                                                                                                  7
Суть проблемы
4. Зоопарк соотношений экрана




                                     8
Тестирование

• Если вы разрабатываете приложение по принципу:
 “сделали – отдали – забыли”, то вам не нужно
тестирование

• Если вы разрабатываете приложение, которое
собираетесь развивать и поддерживать, то вам нужно
тестирование




                                                     9
Классификация тестирования: объект тестирования

 • Функциональное тестирование (functional testing)
 • Тестирование производительности (performance testing)
 • Юзабилити-тестирование (usability testing)
 • Тестирование интерфейса пользователя (UI testing)
 • Тестирование безопасности (security testing)
 • Тестирование локализации (localization testing)
 • Тестирование совместимости (compatibility testing)




                                                     10
Классификация тестирования: по времени проведения


 • Альфа-тестирование (alpha testing)
     • Тестирование при приёмке (smoke testing)
     • Тестирование новой функциональности
       (new feature testing)
     • Регрессионное тестирование (regression testing)
     • Тестирование при сдаче (acceptance testing)
 • Бета-тестирование (beta testing)




                                                         11
Автоматизированное тестирование




Разработчики     Репозитарий      CI сервер

                                              12
Регрессионное автоматическое тестирование

         • Модульные тесты

         • Функциональные интеграционные тесты

         • Тесты UI




                                             13
Тестирование UI




                  14
Тестирование UI




                  15
Тестирование UI


     Тестирование UI по элементам
     – дело занудное




                               16
Вопросы на которые может ответить
  фунциональное тестирование через UI

• Наличие/отсутствие элемента управления

• Видимость этого элемента управления

• Различные другие свойства объекта

• Корректность реакции элемента управления на
действия пользователя




                                                17
Вопросы на которые
фунциональное тестирование
 через UI ответить не может



                              18
Находится ли элемент управления там, где того
             ожидал дизайнер?




                                                19
Выглядит ли элемент управления, так как того
              ожидал дизайнер?




Или с каким конкретным набором данных он выглядит:
● слишком мелко
● не полностью
● и т.д.

                                                     20
Соответствует ли отображение интерфейса
            ожиданиям дизайнера?




А соответствует ли оно ожиданиям заказчика?
                                              21
На эти вопросы может легко
       ответить человек
Надо всего лишь просмотреть все экраны…

Со всеми возможными данными…

На всех возможных разрешениях устройств…

На всех версиях операционной системы…




                                           22
Объем работы тестировщика




                            23
Расчетное время
Количество экранов для разных наборов данных –
 100
Количество разрешений экрана – 5
Время подготовки и изучения одного экрана – 5
 минут

Итоговое время:
              100х5х5=2500мин ~1 неделя
                Для каждой версии ОС
                                                 24
Задача
Нужен фреймоворк, который позволяет:
 Делать автоматическое регрессионное
тестирование приложения

 Учитывать все особенности отображения
элементов управления

 Делать тесты на разных разрешениях экранов и
разных версиях операционной системы
                                                 25
Решение: шаг 1
Для каждого экрана приложения нужно
подготовить наборы тестовых данных, которые
будут в нем отображаться

                          Screen2

     Screen1   DataSet1   DataSet2   DataSet3


                                                …




                                                    26
Решение: шаг 2

Создать тестовое приложение, которое в
автоматическом режиме:
 Загружает заранее подготовленные данные
 Отображает экран
 Делает скриншот этого экрана


                     Примечание: функциональность
                     элементов управления, в данном
                     случае не важна
                                                      27
Решение: шаг 3
                      Screen2
  Screen1    DataSet1 DataSet2 DataSet3

                                           …


 320х240
 640х480
 800х480
 1280х720
 1260х800
 240x320
 480x640
 480x800
 720x1280
 800x1260                     CI сервер       .   .   .   .
…

                                                               28
Первая проверка




                  29
Решение: шаг 4
                     Screen2
Screen1   DataSet1   DataSet2
          DataSet3


                                  …


 320х240
 640х480
                                      .   .     . .
 800х480
 1280х720
 1260х800
 240x320
 480x640
 480x800
 720x1280
 800x1260
…
                                              CI сервер   .   .   . .   30
Последующие проверки



              ?




                       31
Что нужно сделать, чтобы это
          заработало

 Подготовить данные (БД или другое хранилище)

 Отвязать UI приложения от сервисов

 Сделать скриншоты экранов

 Сравнить два изображения и найти разницу




                                                 32
Реализация фреймворка




                        33
Состав фреймворка

             Программная
  Тесты         часть
           (библиотека *.jar)




              Скриптовая
                 часть



                                34
Виды тестов в Android
Система Android на данный момент позволяет
  проводить два вида тестирования Activity:
   
      Unit-testing — тестирование, изолированное
      от    инфраструктуры      системы,    позволет
      заменять некоторые объекты системы.
      Используется класс ActivityUnitTestCase
   
      Instrumentational-testing — тестирование,
      использующее       реальную    инфраструктуру
      системы, позволяет управлять действиями
      тестируемой Activity напрямую. Используется
      класс ActivityInstrumentationTestCase2
                                                   35
Состав библиотеки

Основные классы:
 ScreenshotTaker – непосредственно занимается
созданием скриншотов

Вспомоготельные классы:
 DatabaseHelper – обнуляет базу данных и заполняет
начальными данными

 DataSetReader – считывает исходные данные из файла

 Table – обеспечивает промежуточное хранение данных

                                                       36
Cхема работы теста




                compare


.   .   .   .             37
Инициализация теста
 Инициализируем ScreenshotTaker

 Загружаем данные (если они одинаковые для всех
тестов группы)




                                                   38
Загрузка данных в БД приложения

 Использовать DBUnit
было сложно

 Разработали свой
модуль загрузки данных

 Поддерживает один
из двух форматов DBUnit




                                  39
Загрузка данных в БД приложения




                                  40
Выполнение скриншота
 Выполнение скриншота делается внутренними
механизмами Android

 Рассматривался вариант выполнения скриншота
хостовой ОС




                                                41
Сравнение скриншотов
 Сравнение двух изображений построено на базе
ImageMagick

 Различия между двумя скриншотами помечаются




                                                 42
Исключение части экрана
Интерфейс иногда содержит компоненты, значения
которых постоянно меняются, типа часов, прогресс
баров и т.д.




                                                   43
Строение экрана в Android




                            44
Входные данные метода
Метод, создающий скриншоты, принимает следующие
 агрументы:

 Activity — та активити, скриншот элемента которой
 будет производиться
 Int — идентификатор элемента, снимок которого
 будет производиться
 Int — список индетификаторов тех элементов,
 котороые надо исключить
 String — уникальное имя скриншота, используется в
 именовании в файловой системе
                                                      45
Создание скриншота
Пример вызова функции, где создается скриншот
корневого элемента с исключением      элемента с
идентификатором «contact_progressbar»




                                               46
Алгоритм скрипта сравнения
            скриншотов
Копирование скриншотов с
       устройства                       Начало



 Остались непроверенные     нет
      скриншоты?

               да
         Есть ли           нет     Принять за
       эталонный?                  эталонный
                                                 Генерирование
               да                                    отчета
     Есть разница с        да     Отправить на
                                    проверку
      эталонным?
                                  тестировщику
             нет
                                                    Конец


                                                             47
Заключение
• Был реализован фреймворк для ОС Android,
  позволяющий тестировать графический
  интерфейс приложения
• Планируется реализовать аналогичную систему
  для iOS, затем для WinPhone8
• Исходный код доступен по лицензии
  Creative Commons Attribution-NonCommercial-
  ShareAlike 3.0



                                                48
Благодарим за внимание
https://github.com/tomsksoft/screen-tester-android




                               Сергей Борисов, tech lead, ТомскСофт
                                                  bsi@tomsksoft.com

                                  Иван Лебедев, интерн, ТомскСофт
                                                 lia@tomsksoft.com




                                                               49

More Related Content

Автоматическое тестирование мобильных приложений на основе скриншотов

  • 1. Автоматическое тестирование мобильных приложений на основе скриншотов Сергей Борисов, tech lead, ТомскСофт Иван Лебедев, интерн, ТомскСофт
  • 2. Об авторах Сергей Борисов В настоящее время: - Руководитель проекта в ТомскСофт - ст. преп-ль в ТУСУР, каф. КСУП Ранее: - MobilTeck - SiberLogic - ЭлеСи - ТМЦДО ТУСУР - НИИ АЭМ Общий стаж в разработке ПО: 19 лет Общий стаж в высшем образовании: 15 лет 2
  • 3. Об авторах Иван Лебедев В настоящее время: - Интерн в ТомскСофт - студент 5-го курса ТУСУР, каф. КСУП 3
  • 4. Суть проблемы 1. Приложения обладают UI (особенно мобильные) 4
  • 5. Суть проблемы 2. UI включает множество различных элементов с разным форматированием 5
  • 6. Суть проблемы 3. Зоопарк различных разрешающих способностей 6
  • 7. Суть проблемы 3. Зоопарк различных разрешающих способностей 120 точек на дюйм 160 точек на дюйм 240 точек на дюйм 320 точек на дюйм Маленький 240x320 480x640 Нормальный 240x400 320x480 480x800 640x960 240x432 480x854 600x1024 Большой 480x800 480x800 480x854 480x854 600x1024 Очень большой 1024x600 1280x800 1536x1152 2048x1536 1024x768 1920x1152 2560x1536 1280x768 1920x1200 2560x1600 7
  • 8. Суть проблемы 4. Зоопарк соотношений экрана 8
  • 9. Тестирование • Если вы разрабатываете приложение по принципу: “сделали – отдали – забыли”, то вам не нужно тестирование • Если вы разрабатываете приложение, которое собираетесь развивать и поддерживать, то вам нужно тестирование 9
  • 10. Классификация тестирования: объект тестирования • Функциональное тестирование (functional testing) • Тестирование производительности (performance testing) • Юзабилити-тестирование (usability testing) • Тестирование интерфейса пользователя (UI testing) • Тестирование безопасности (security testing) • Тестирование локализации (localization testing) • Тестирование совместимости (compatibility testing) 10
  • 11. Классификация тестирования: по времени проведения • Альфа-тестирование (alpha testing) • Тестирование при приёмке (smoke testing) • Тестирование новой функциональности (new feature testing) • Регрессионное тестирование (regression testing) • Тестирование при сдаче (acceptance testing) • Бета-тестирование (beta testing) 11
  • 13. Регрессионное автоматическое тестирование • Модульные тесты • Функциональные интеграционные тесты • Тесты UI 13
  • 16. Тестирование UI Тестирование UI по элементам – дело занудное 16
  • 17. Вопросы на которые может ответить фунциональное тестирование через UI • Наличие/отсутствие элемента управления • Видимость этого элемента управления • Различные другие свойства объекта • Корректность реакции элемента управления на действия пользователя 17
  • 18. Вопросы на которые фунциональное тестирование через UI ответить не может 18
  • 19. Находится ли элемент управления там, где того ожидал дизайнер? 19
  • 20. Выглядит ли элемент управления, так как того ожидал дизайнер? Или с каким конкретным набором данных он выглядит: ● слишком мелко ● не полностью ● и т.д. 20
  • 21. Соответствует ли отображение интерфейса ожиданиям дизайнера? А соответствует ли оно ожиданиям заказчика? 21
  • 22. На эти вопросы может легко ответить человек Надо всего лишь просмотреть все экраны… Со всеми возможными данными… На всех возможных разрешениях устройств… На всех версиях операционной системы… 22
  • 24. Расчетное время Количество экранов для разных наборов данных – 100 Количество разрешений экрана – 5 Время подготовки и изучения одного экрана – 5 минут Итоговое время: 100х5х5=2500мин ~1 неделя Для каждой версии ОС 24
  • 25. Задача Нужен фреймоворк, который позволяет:  Делать автоматическое регрессионное тестирование приложения  Учитывать все особенности отображения элементов управления  Делать тесты на разных разрешениях экранов и разных версиях операционной системы 25
  • 26. Решение: шаг 1 Для каждого экрана приложения нужно подготовить наборы тестовых данных, которые будут в нем отображаться Screen2 Screen1 DataSet1 DataSet2 DataSet3 … 26
  • 27. Решение: шаг 2 Создать тестовое приложение, которое в автоматическом режиме:  Загружает заранее подготовленные данные  Отображает экран  Делает скриншот этого экрана Примечание: функциональность элементов управления, в данном случае не важна 27
  • 28. Решение: шаг 3 Screen2 Screen1 DataSet1 DataSet2 DataSet3 …  320х240  640х480  800х480  1280х720  1260х800  240x320  480x640  480x800  720x1280  800x1260 CI сервер . . . . … 28
  • 30. Решение: шаг 4 Screen2 Screen1 DataSet1 DataSet2 DataSet3 …  320х240  640х480 . . . .  800х480  1280х720  1260х800  240x320  480x640  480x800  720x1280  800x1260 … CI сервер . . . . 30
  • 32. Что нужно сделать, чтобы это заработало  Подготовить данные (БД или другое хранилище)  Отвязать UI приложения от сервисов  Сделать скриншоты экранов  Сравнить два изображения и найти разницу 32
  • 34. Состав фреймворка Программная Тесты часть (библиотека *.jar) Скриптовая часть 34
  • 35. Виды тестов в Android Система Android на данный момент позволяет проводить два вида тестирования Activity:  Unit-testing — тестирование, изолированное от инфраструктуры системы, позволет заменять некоторые объекты системы. Используется класс ActivityUnitTestCase  Instrumentational-testing — тестирование, использующее реальную инфраструктуру системы, позволяет управлять действиями тестируемой Activity напрямую. Используется класс ActivityInstrumentationTestCase2 35
  • 36. Состав библиотеки Основные классы:  ScreenshotTaker – непосредственно занимается созданием скриншотов Вспомоготельные классы:  DatabaseHelper – обнуляет базу данных и заполняет начальными данными  DataSetReader – считывает исходные данные из файла  Table – обеспечивает промежуточное хранение данных 36
  • 37. Cхема работы теста compare . . . . 37
  • 38. Инициализация теста  Инициализируем ScreenshotTaker  Загружаем данные (если они одинаковые для всех тестов группы) 38
  • 39. Загрузка данных в БД приложения  Использовать DBUnit было сложно  Разработали свой модуль загрузки данных  Поддерживает один из двух форматов DBUnit 39
  • 40. Загрузка данных в БД приложения 40
  • 41. Выполнение скриншота  Выполнение скриншота делается внутренними механизмами Android  Рассматривался вариант выполнения скриншота хостовой ОС 41
  • 42. Сравнение скриншотов  Сравнение двух изображений построено на базе ImageMagick  Различия между двумя скриншотами помечаются 42
  • 43. Исключение части экрана Интерфейс иногда содержит компоненты, значения которых постоянно меняются, типа часов, прогресс баров и т.д. 43
  • 45. Входные данные метода Метод, создающий скриншоты, принимает следующие агрументы:  Activity — та активити, скриншот элемента которой будет производиться  Int — идентификатор элемента, снимок которого будет производиться  Int — список индетификаторов тех элементов, котороые надо исключить  String — уникальное имя скриншота, используется в именовании в файловой системе 45
  • 46. Создание скриншота Пример вызова функции, где создается скриншот корневого элемента с исключением элемента с идентификатором «contact_progressbar» 46
  • 47. Алгоритм скрипта сравнения скриншотов Копирование скриншотов с устройства Начало Остались непроверенные нет скриншоты? да Есть ли нет Принять за эталонный? эталонный Генерирование да отчета Есть разница с да Отправить на проверку эталонным? тестировщику нет Конец 47
  • 48. Заключение • Был реализован фреймворк для ОС Android, позволяющий тестировать графический интерфейс приложения • Планируется реализовать аналогичную систему для iOS, затем для WinPhone8 • Исходный код доступен по лицензии Creative Commons Attribution-NonCommercial- ShareAlike 3.0 48
  • 49. Благодарим за внимание https://github.com/tomsksoft/screen-tester-android Сергей Борисов, tech lead, ТомскСофт bsi@tomsksoft.com Иван Лебедев, интерн, ТомскСофт lia@tomsksoft.com 49