Непрерывная интеграция

Придайте гибкости своей команде, ускорив обратную связь. Ваша реальная скорость определяется скоростью ваших тестов.

Dan Radigan Автор: Dan Radigan
Просмотр тем

Ничто не создает (и не разрушает) гибкость так, как стремление команды к непрерывной интеграции (CI). Это может звучать жутковато (особенно если ваша команда еще не внедрила CI), но есть и хорошие новости. Независимо от того, какие технологии использует команда, вполне вероятно, что уже существует платформа для непрерывной интеграции и автоматического тестирования, которая будет работать для нужной базы кода.

Что такое непрерывная интеграция?

Непрерывная интеграция — это рекомендация Agile и DevOps, с учетом которой изменения кода регулярно интегрируются в основную ветку репозитория, а тестирование в отношении изменений проводится как можно чаще и раньше. В идеале разработчики должны интегрировать свой код ежедневно, а то и несколько раз в день.

Преимущества непрерывной интеграции

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

Это происходит совсем не быстро.

Защитите качество своего продукта с помощью непрерывных сборок и автоматизации тестирования

Как часто, скачав последнюю версию исходного кода, нам приходится натыкаться на то, что он не компилируется или содержит серьезный баг? Какая уж тут эффективная работа!

От такой ситуации могут спасти два подхода.

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

Автоматизация тестирования: программная проверка ПО для обеспечения качества. Тесты могут инициировать действия в ПО из пользовательского интерфейса (подробнее об этом чуть позже) или на уровне сервисов бэкенда.

Эти два подхода — как масло и варенье на вашем бутерброде: по отдельности вкусно, вместе — просто восторг! Непрерывная интеграция объединяет непрерывную сборку с автоматизацией тестирования. В результате при каждой сборке оценивается и качество базы кода.

И помните: для полной реализации потенциальных преимуществ команда должна быть достаточно дисциплинированной, чтобы приостанавливать разработку и незамедлительно приступать к устранению сбоев. Энергия, которую команда инвестирует в написание тестов и настройку автоматизации (помните, что это действительно инвестиции), будет потрачена напрасно, если сборки будут долго оставаться в нерабочем состоянии. Защита инвестиций в непрерывную интеграцию и обеспечение качества базы кода — это одно и то же.

Тестирование при CI: модульные тесты, тесты API и функциональные тесты

В ходе непрерывной интеграции выполняется два основных этапа. На первом этапе выполняется проверка компилируемости кода (в случае интерпретируемых языков все элементы проекта на этом этапе просто собираются воедино). Второй этап включает проверку того, что код работает надлежащим образом. Самый надежный способ такой проверки — серия автоматических тестов, оценивающих продукт на всех уровнях.

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

Модульные тесты работают очень близко к основным компонентам кода. Это первая линия обеспечения качества.

Преимущества: просто пишутся, быстро выполняются, довольно точно моделируют архитектуру базы кода.

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

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

Тесты API

Хорошее программное обеспечение должно быть модульным, то есть позволять четко распределять виды работ по отдельным приложениям. API являются точками подключения, через которые различные модули взаимодействуют друг с другом. Тесты API проверяют эти точки, выполняя вызовы из одного модуля в другой.

Преимущества: как правило, легко пишутся и быстро запускаются; кроме того, можно без труда моделировать взаимодействие приложений.

Недостатки: на простых отрезках кода тесты API могут повторять некоторые модульные тесты.

Поскольку API являются интерфейсами между частями приложения, они особенно полезны при подготовке релиза. Если при сборке версии, запланированной к релизу, будут успешно пройдены все тесты API, команда сможет с гораздо большей уверенностью начать распространение такой версии продукта для клиентов.

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

Функциональные тесты выполняются в отношении более крупных частей базы кода и моделируют пользовательские процессы. Например, при тестировании веб-приложений HTTPUnit и Selenium с целью проверки продукта взаимодействуют непосредственно с пользовательским интерфейсом.

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

Недостатки: работают медленнее (по сравнению с модульными тестами); иногда возможны ложноотрицательные результаты по причине задержки в сети или кратковременного простоя в какой-либо части технологического стека.

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

Кстати говоря...

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

Ускоряйте непрерывную интеграцию

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

Выполнение автоматических тестов может существенно усложнить и затянуть выполнение сборки. Одна из стратегий заключается в распараллеливании автоматических тестов на нескольких серверах, или «агентах сборки», чтобы на сервере непрерывной интеграции фактически выполнялось 2, 20 или даже 200 тестов одновременно. Облачные технологии позволяют по мере расширения наборов тестов без труда масштабировать ресурсы процессора в соответствии с потребностями команды разработки. Однако ресурсы процессора не бесконечны. Тестировать каждый участок кода нужно в полной мере, но без избыточности. Избыточные тесты чрезмерно увеличивают продолжительность сборки (и тратят ресурсы процессора впустую). Чем быстрее разработчики получают зеленый свет, тем быстрее они могут перейти к следующему пункту бэклога.

Ветвление и непрерывная интеграция —это идеальное сочетание!

Многие команды избегают создания новых веток из-за мучительного процесса последующего слияния. Однако новые технологии контроля версий, такие как Git, упрощают как ветвление, так и слияние. Чтобы гарантировать, что основной поток кода (main на языке Git) останется работоспособным, нужно обеспечивать одинаковый уровень непрерывной интеграции как во всех ветках разработки, так и в ветках стабильных версий. Когда сборка ветки завершается успешно, команда может спокойно выполнять ее слияние с основным потоком кода.

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

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

продолжение темы
Дизайн