Введение 3
Глава 1. Введение в непрерывную интеграцию 8
1.1 Компоненты CI 8
1.2 Значение CI 13
1.3 Риски 14
Глава 2. Web-приложение, основные компоненты и объекты тестирования 21
Глава 3. Средства непрерывной интеграции, обзор инструментов 25
Глава 4. Модель непрерывной интеграции 39
4.1 Реализация первого уровня тестирования 42
4.1.1 Тесты компиляции исходного кода 43
4.1.2 Тесты корректности развертывания 44
4.2 Реализация второго уровня тестирования 44
4.2.1 Юнит-тесты исходного кода 44
4.2.2 Функциональные Web-тесты 46
4.2.3 Тесты инспекции кода (выявление дублирующего кода) 47
4.3 Система обратной связи 48
4.4 Объединение модулей тестирования в систему непрерывной интеграции ... 50
4.5 Результаты внедрения 51
Заключение 53
Список литературы 54
Приложение
Процесс интеграции программного обеспечения — далеко не новая проблема. В проекте, выполняемом одним человеком с небольшими внешними зависимостями, интеграция программного обеспечения — не существенная проблема, но при увеличении сложности проекта (даже если в него просто добавлен еще один человек) создается насущная потребность в интеграции и проверке слаженной работы компонентов программного обеспечения, причем заранее и часто. Дожидаться конца проекта для проведения интеграции и выявления всего спектра возможных ошибок — неразумно, и, не способствует качеству программного обеспечения, а зачастую даже приводит к удорожанию и задержке сдачи проекта. Непрерывная интеграция снижает подобные риски (1).
Непрерывная интеграция (далее CI, от англ. Continuous Integration) - это особый принцип разработки программного обеспечения, который призван значительно упростить жизнь группе тестирования программного обеспечения. Система CI - это некая программа, которая следит за системой контроля версиями вашего приложения, и при появлении там изменений автоматически стягивает их, собирает, прогоняет тесты, собирает отчеты, и, что самое главное - в случае неудачи на любом из этапов дает об этом знать всем заинтересованным лицам, в первую очередь - разработчику, сделавшему последнее изменение, а также тестировщикам.
По примерным оценкам на обнаружение и исправление ошибок тратится от 40 до 80 процентов общей стоимости разработки программного обеспечения (2). Кроме того, по статистике, программы содержат от 1 до 3 ошибок на 100 строк кода (2). Ошибка, найденная на поздних этапах разработки программного продукта может привести к необходимости внесения серьезных изменений в общую архитектуру продукта. Таким образом, чем раньше будет найдена ошибка, тем дешевле будет стоить ее исправление.
В данной работе особый акцент делается на тестирование в непрерывной интеграции. CI для группы тестирования - это возможность эффективно контролировать качество, сроки и бюджет, поскольку решения по рабочему программному обеспечению при помощи CI будут основываться на фактической обратной связи и показателях, а не только на элементах задачи и расписании проекта.
Основная цель данной работы - изучить концепции и практики, благодаря которым можно построить автоматизированную систему тестирования, которая позволила бы создавать слаженное, работоспособное программное обеспечение.
В данной работе рассматриваются следующие вопросы:
• Как реализовать систему непрерывной интеграции для web-приложений, при которой программное обеспечение будет проверяться на каждом этапе разработки;
• Как CI способна сократить время между проявлением дефекта и обнаружением его причины, удешевляя таким образом его устранение;
• Как обеспечить качество программного обеспечения в результате его частой интеграции, не откладывая это на последние этапы разработки;
• Как смоделировать оптимальную стратегию комплексного тестирования приложения с использованием сред непрерывной интеграции;
• При помощи каких инструментов и как можно связать модули комплексного тестирования и сбор отчетов.
В задачи отдела тестирования входят:
- комплексный контроль качества;
- подготовка тестовой документации (планы тестирования и пр.);
- обнаружение и локализация ошибок в функционировании программных продуктов;
- фиксирование и отслеживание ошибок в функционировании программных средств;
- проверка соответствия документации программного продукта стандартам и реально реализованным функциям;
- участие в разработке и внедрении системы качества;
- автоматизация тестирования;
- оценка производительности разрабатываемых программных средств на различных программно-аппаратных платформах и их специфических конфигурациях.
В некоторых компаниях на отдел тестирования возлагаются сборка и выпуск программного обеспечения (в некоторых компаниях этим занимается отдел разработки) (1). Все отделы компании взаимодействуют между собой, при этом взаимодействия упорядочены между собой и представляют производственные технологические процессы. Технологические процессы, как правило, регламентированы внутренними документами или внутрикорпоративными стандартами; в совокупности представляют собой технологический цикл производства программного средства.
Создание хорошего программного обеспечения сводится к соблюдению фундаментальных практик, причем независимо от специфической технологии. Исходя из личного опыта, в процессе тестирования программного обеспечения главными проблемами являются:
1) Плохая коммуникация участников разработки и тестировщиков.
Механизмы связи, поддерживаемой вручную, требуют серьезной
координации, чтобы гарантировать своевременную доставку информации проекта нужным людям.
2) Высокое влияние человеческого фактора при тестировании.
3) Ежедневное увеличение количества повторяемых процессов, выполняемых вручную.
4) Малое представление о текущем состоянии продукта.
Главными целями данной работы являются:
• Сокращение времени тестирования.
• Обеспечение более частых проверок приложения (Одна из основных целей автоматизации).
• Уменьшение влияния “человеческого фактора” (При этом необходимо понимать, что довольно часто тесты не отлавливают дефекты, которые сможет обнаружить человек).
• Внедрение новых видов тестирования.
• Сокращение времени выпуска нового релиза приложения.
• Замена ручного тестировщика автоматизированными проверками.
• Быстрое получение информации о текущем состоянии системы.
• Автоматизация ручных сценариев.
• Упрощение тестирования.
Сервер непрерывной интеграции Jenkins изначально создавался как инструмент для любых задач, координирующих выполнение операций, составляющих бизнес-процессы. Выбор Jenkins как инструмента, вокруг которого будет создаваться планировщик потока работ, аргументируется в главе “Среды непрерывной интеграции”. Непрерывная интеграция и непрерывная поставка (Continuous Integration/Continuous Delivery) являются популярными трендами области разработки и тестирования программного обеспечения, и разработчики Jenkins пытаются следовать этим трендам. Так, на данный момент для Jenkins существует около 1200 плагинов, которые поддерживаются обществом из 500 активных разработчиков. В 2016 году вышел релиз Jenkins 2.0, в котором появилось несколько нововведений, значительно упростивших работу IT компаниям, использующим данный продукт (3). О реализации системы непрерывного интегрирования в тестировании программного обеспечения более подробно описано в главе “Построение полнофункциональной системы непрерывного интегрирования”.
В главе “Введение в непрерывную интеграцию” описываются процессы тестирования, реализация которых возможна в рамках непрерывной интеграции. Далее описываются компоненты системы непрерывной интеграции, и то, как эти компоненты взаимодействуют друг с другом.
Для показательного примера применения непрерывной интеграции для комплексного тестирования программного обеспечения было разработано приложение “Croplinks.pro”
Приложение состоит из нескольких модулей:
• Web-интерфейс, написанный на Python Django;
• API, разработанном на компилируемом языке Golang;
• База данных (MySQL);
• Nginx - http-сервер;
• Supervisor - менеджер процессов.
В главе “Построение CI” описывается оптимальная модель построения непрерывной интеграции в среде непрерывной интеграции для многомодульного web-приложения. Также описываются примеры применения современных инструментов тестирования и их связка в системе непрерывной интеграции.
Данное исследование будет полезно:
• Руководителям групп тестирования, которые хотят внедрить автоматизацию у себя в проекте
• Командам, у которых автоматизация тестирования не приносит положительных результатов
• Инженерам, которые автоматизируют свои рутинные действия и хотят вывести эти процессы на командный уровень.
В результате проведённой работы была разработана модель непрерывной интеграции комплексного тестирования программного обеспечения. Для поставленной задачи были проанализированы среды непрерывной интеграции. Также данная модель была реализована в связке современных инструментов тестирования, среды непрерывной интеграции Jenkins и приложения на языке Python. Для демонстрации внедрения данной модели в тестирование было разработано web-приложение, являющееся показательным для внедрения данной модели непрерывной интеграции.
Приложение croplinks.pro:
• Имеет web-интерфейс, API, базу данных и много других компонентов, усложняющих комплексную проверку, проводимую группой тестирования.
• Исходный код приложения доступен на GitHub.
Приложение ci_in_testing:
• Инструмент автоматизации тестирования
• Содержит файлы конфигурации сборки в Jenkins
• Планировщик для регулярного запуска комплексного тестирования программного обеспечения, написанный на Python.
• Исходный код приложения доступен на GitHub.
Проект ci_in_testing был внедрён в реальный процесс разработки ПО в компании FIX. Было проведено перестроение процесса тестирования, направленное на использование непрерывной интеграции. Анализ перестроенного процесса и сравнение его с принятым до этого показал, что использование непрерывной интеграции и, в частности, разработанной модели, позволило добиться уменьшения времени на тестирование изменений разработчиками в 1,5 раза.