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

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Аннотация

Данная работа описывает технологию автоматизированного end-to-end тестирования, пригодного для применения в современных компаниях, разрабатывающих программные продукты. Разработанный подход позволяет тестировать клиентские приложения для платформ iOS, Android и Web, а также серверную часть. В процессе разработки был применен подход, построенный на базе контейнерной виртуализации и оркестрации, применяющий такие CI/CD инструменты, как: Kubernetes, Docker, TravisCI, Selenium, Appium. Для разработки использовались языки и фреймворки: Java, Swift, Javascript, React, Webdriverio, Golang, а также базы данных: MySQL и MongoDB. В качестве облачных решений были выбраны Amazon Webservices и Google Kubernetes Engine.

Abstract

This paper describes the technology of automated end-to-end testing, suitable for use in modern companies that develop software products. The developed approach allows testing client applications for iOS, Android and Web platforms, as well as the server side. In the development process, an approach based on container virtualization and orchestration was applied using CI / CD tools such as: Kubernetes, Docker, TravisCI, Selenium, Appium. The following languages and frameworks were used for development: Java, Swift, Javascript, React, Webdriverio, Golang, and also databases: MySQL and MongoDB. Amazon Webservices and Google Kubernetes Engine were chosen as cloud solutions.

Оглавление

Введение

1 Актуальность разработки

2 Цели и задачи

2.1 Обоснованность

2.2 Практическая значимость работы

2.3 Постановка задачи

3 Внедрение результатов работы

4 Личный вклад

5 Апробация результатов

6 Анализ предметной области

6.1 Системы интеграций

6.2 Системы тестирования серверных приложений

6.3 Фреймворки тестирования мобильных приложений

6.4 Фреймворки и подходы тестирования web-приложений

7 Разработка iOS части

7.1 Разработка приложения на платформу iOS

7.2 Разработка алгоритма непрерывного тестирования кода

7.3 Написание E2E тестов на базе Appium

7.4 Запуск системы

8 Разработка Android части

8.1 Разработка приложения

8.2 Разработка алгоритма непрерывного тестирования кода:

8.3 Написание E2E тестов на платформе Appium:

8.4 Запуск системы:

9 Разработка Web части

9.1 Разработка веб-приложения

9.2 Разработка алгоритма непрерывного тестирования кода

9.3 Selenium Server и WebdriverIO

9.4 Запуск системы

10 Разработка Backend части

10.1 Проектирование

10.2 Разработка

10.3 Развёртка

10.4 Разработка алгоритма непрерывного тестирования кода

10.5 Написание тестов

10.6 Запуск системы

11 Результат работы

Терминологический словарь

Список использованных источников

Введение

Любой крупный программный продукт нуждается в решении проблем, связанных с обеспечением качества системы. В настоящее время необходимо сохранять гибкость в управлении непрерывно растущим пользовательским трафиком, быть адаптивным к постоянно меняющимся технологиям и отвечать требованиям бизнеса. Вот почему так важно находить надежный способ тестирования, который понятен и требует минимальной отладки после конфигурации.

1 Актуальность разработки

Методы разработки меняются вместе с парадигмами программирования. Программы становятся сложнее, и скорость разработки замедляется. Эти два важных фактора формируют текущий рынок программного обеспечения и требуют от разработчиков гибкости в обновлении приложений. В свою очередь, формируется спрос на надежные методы сопровождения приложений:

Отсутствие сбоев при развертывании приложений;

Облегчение способа изменения версии приложений: как обновление, так и возврат на прошлые версии;

Реализация мультиплатформенного тестирования;

Снижение временных и денежных издержек на ручное тестирование;

Снижение временных и денежных издержек на поддержку сетевой и серверной инфраструктуры.

Таким образом, современная концепция разработки программного обеспечения должна позволять спланировать процесс так, чтобы разработчики перестали вручную тестировать, создавать и развертывать программное обеспечение или нанимать для этих задач отдельных сотрудников. Большинство систем, не связанных с непосредственным кодированием, должны быть автоматизированы. Вот почему системы CI/CD, включающие, как и развертывание, так и тестирование, как никогда актуальны.

2 Цели и задачи

Целью разработки является автоматизированная и применяемая на IT-предприятиях система интеграции версий мультиплатформенного приложения: его тестирования и развертывания.

2.1 Обоснованность

тестирование приложение клиентский android

Обоснованность результатов исследований существующих инструментов, выводов и практических решений, полученных в дипломной работе, обеспечиваются применением ее компонентов в различных российских IT-компаниях. Так, например, компания OneTwoTrip, где работали Заблудовский Глеб, использовала схожий подход для контенейризации и оркестрации в своей инфраструктуре. Компания Ozon.ru добавила в свой Kubernetes-кластер Selenium Server`а, таким образом наладив end-to-end тестирование. Компания Finch, в которой работал Фесенко Георгий, применила его решение и настроила себе процесс развертывания под платформу iOS. Практические результаты, сформулированные в дипломной работе, обоснованы проведенными исследованиями и результатами разработки и могут служить руководством при решении реальных задач индустрии.

2.2 Практическая значимость работы

Практическая значимость работы заключается в реализации системы в виде комплекса программных средств, позволяющих регулировать сборку, развертывание, тестирование программного обеспечения, а также настраивать сетевую и серверную инфраструктуру. Применение подобной системы позволит радикально сократить расходы на поддержку и тестирование в IT-компании любого размера.

2.3 Постановка задачи

Первоначальная задача исследования - описать и показать на примере мультиплатформенного приложения наиболее актуальный подход в области CI/CD, основанный на опыте некоторых ведущих российских ИТ-компаний и на практических исследованиях. Эффективный и простой подход можно представить, ответив на следующие вопросы:

Почему так важно стремиться к Continuous Integration и end-to-end тестированию?

Каким образом должно быть организовано развертывание нового кода?

Где и как должны запускаться приложения и бэкенд?

Как правильно запускать тесты?

Как организовать процесс написания тестов на соответствующих языках программирования?

Как правильно и понятно измерять производительность?

Какие шаги необходимы для интеграции изобретенной системы в бизнес-процессы?

Как разработанная технология влияет на процесс разработки?

Вместе с этим, данную работу можно разбить на две основные подзадачи.

Первая подзадача предлагаемого исследования - разработка полнофункциональной автоматизированной системы интеграции продукта. Более того, эта функциональность должна предоставляться унифицировано, поскольку разрабатываемый продукт является мультиплатформенным веб-приложением.

Вторая подзадача носит более исследовательский характер и состоит в том, чтобы изобрести подходящий алгоритм для использования такой системы, поскольку ее применение предполагается в современном IT-мире.

В связи со сложностью проекта было решено распределить задачи между участниками проекта по платформам:

Web

Разработка современного веб-приложения, базирующегося на технологиях веб-сокетов, отслеживания геолокации, авторизации и хранения сессий пользователей, которое послужит базой для отработки технологии непрерывного тестирования;

Привязка технологии тестирования к одной платформе, как для веб, так и для iOS и Android;

Конфигурация удаленной Linux машины и создания кластера с контейнерами, с запущенными внутри Selenium серверами;

Написание end-to-end тестов для веб-приложения;

Создание continuous integration для веб-приложения.

iOS

Написание iOS приложения со сложной внутренней логикой, включающей такие технологии, как: веб-сокеты, поиск по геолокации, авторизация пользователя;

Написание end-to-end тестов для iOS приложения;

Разработка системы прогона тестов с использованием технологии контейнерной виртуализации на базе open-source платформы Appium.

Android

Написание Android приложения со сложной внутренней логикой, включающей такие технологии, как: веб-сокеты, поиск по геолокации, авторизация пользователя;

Написание end-to-end тестов для приложения Android;

Разработка системы прогонки тестов с использованием технологии контейнерной виртуализации на базе open-source платформы Appium.

Backend

Проектирование и разработка современного API, обслуживающего мобильные и веб-версии;

Создание платформы для тестирования API;

Написание unit-тестов, разработка и реализация позитивных и негативных сценарных тестов для сервера.

DevOps

Конфигурация удаленной Linux машины для веб-сервера приложения;

Разработка общего принципа быстрого continuous integration и распространение практики на другие платформы в команде;

Интеграция репортеров и цифровых отчетов для формирования наглядного результата тестирования на всех платформах;

Управление нагрузками на обоих Linux-машинах, веб-сервере и кластере с контейнерами Selenium Server'a.

3 Внедрение результатов работы

Результаты дипломной работы применены полностью или частично в двух IT-компаниях: Ozon.ru и Finch.

Ozon.ru полностью автоматизировал end-to-end тестирование интерфейсов за период с осени 2018 года по весну 2019 года. Изначально, существовало несколько проблем, которые замедляли обновление программного продукта:

Написание тестов велось на языке Python, а не на языке разработки JavaScript;

Отсутствовала инфраструктура для запуска end-to-end тестов;

Тестирование не было включено в pipeline развертываемого приложения.

В итоге, компания исправила эти недочеты, начав разрабатывать тесты на языке разработки с помощью JavaScript-фреймворка WebdriverIO и запуская тестирование на Selenium Servers в общем Kubernetes-кластере. К весне все команды написали свой набор тестов, составляющих примерно 40 штук на команду, которые запускаются при каждом релизе, в каждой feature­-ветке, а также осуществляются ночные прогоны. Таким образом, в одном из крупнейших E-commerce компаний России было автоматизировано end-to-end тестирование интерфейсов.

Finch внедрил технологию выкладки iOS приложения посредствам fastlane, что упростило процесс доставки сборок заказчику. Так как компания специализируется на разработке мобильных приложений под ключ, это существенно сократило время, затрачиваемое разработчиками на регулярные отправки сборок в бизнес-тестирование.

4 Личный вклад

Обязанности были распределены по платформам:

Оленев Александр Юрьевич (группа БИВ153) отвечал за разработку web-клиента, настройку CI для web-приложения, конфигурирование Selenium Server и проектирование Selenium Router для параллельного запуска тестов;

Фесенко Георгий Евгеньевич (группа БИВ154) отвечал за разработку клиента под iOS, настройку CI для iOS-приложения, конфигурирование Appium для автоматизированного тестирования мобильного приложения;

Кузнецов Виталий Владимирович (группа БИВ154) отвечал за разработку клиента под Android, настройку CI для Android-приложения, конфигурирование Appium для автоматизированного тестирования мобильного приложения;

Заблудовский Глеб Владимирович (группа БИВ154) отвечал за разработку серверной части, включая проектирование баз данных, настройку end-to-end тестирования с помощью Docker и настройку CI для приложения на языке GoLang

Калугин Антон Сергеевич (группа БИВ154) выполнял роль DevOps-инженера, отвечал за настройку облачных решений на базе сервисов Amazon Web Services и Google Kubernetes Engine, за управление баз данных MySQL и MongoDB, используемых в ходе разработки.

5 Апробация результатов

Результаты, полученные в ходе работы над дипломным проектом, представлялись и обсуждались в двух IT-компаниях:

Оленев Александр Юрьевич выступал с докладом на тему «Эффективное end-to-end тестирование frontend» на встрече разработчиков интерфейсов компании Ozon.ru (Москва, 2018), где рассказывал про то, как организовать тестирование с помощью фреймворка WebdriverIO и Selenium Server.

Фесенко Георгий Евгеньевич выступал с докладом на тему «CI/CD для разработки под iOS» в компании Finch (Москва, 2018), где рассказывал о том, как правильно выстроить процесс развертывание мобильного приложения под iOS на базе TravisCI.

6 Анализ предметной области

Разработка технологий непрерывного тестирования и интеграции сама по себе не является чем-то новым для мира программного обеспечения. История развития компьютерной науки и продуктовой разработки насчитывает несколько попыток создать надежный способ развертывания и тестирования приложений для различных платформ. Зачастую использовался комплексный подход, заключающийся в применении нескольких инструментов, которые вкупе могли бы значительно улучшать проверку качества ПО. Однако получающиеся системы не являлись надежными по причинам нестабильности инфраструктуры или сложности интеграции с кодовой базой проекта.

Чаще всего предпринималась попытка сделать единую точку входа для end-to-end тестирования мобильных приложений, веб-приложений и серверного кода, однако эта идея изначально была нежизнеспособна. Причина в том, что технологии под каждую из платформ изначально строились на разных подходах и языках программирования и далее, что закономерно, развивались порознь. Поэтому системы, построенные на базе так называемой «фермы тестирования», оказывались слишком хрупкими, ведь гораздо труднее настроить инфраструктуру для бесперебойного тестирования, чем просто написать тест-кейсы.