Обеспечение качества и процессы доставки программного обеспечения во фронтенд-инжиниринге
Как мы улучшили SDLC веб-приложений в Azimo
Это первая статья из серии сообщений в блоге, в которых мы описываем наши процессы обеспечения качества и разработки программного обеспечения для разработки интерфейса в Azimo.
Вторая запись в блоге уже опубликована здесь.
Существует большая разница между контролем качества и обеспечением качества. QC фокусируется в основном на выполнении требований к качеству. Он гарантирует, что конечный продукт работает должным образом и не содержит ошибок.
Гарантия качества — это гораздо больше. Сосредоточив внимание на всем процессе, он укрепляет уверенность инженеров в качестве, повышает эффективность тестирования и разработки и тем самым позволяет нам быстрее поставлять продукцию небольшими партиями. Конечными целями QA являются улучшение процессов SDLC, масштабируемость команды и гибкость. Качественные и безглючные продукты являются (только) производными от этого.
Как сказано в книге Accelerate: The Science of Lean Software and DevOps и связанных с ней отчетах State of DevOps:
«Скорость и стабильность — это результаты, которые дополняют друг друга».
Помня обо всем этом, мы уделяем много времени развитию культуры контроля качества в команде Frontend Engineering в Azimo. В этой серии сообщений в блоге подводятся итоги наших достижений и ключевых изменений в процессе, которые мы внесли за последние годы.
Отправная точка
Несколько лет назад наши веб-приложения разрабатывались по следующим принципам:
- Еженедельный цикл выпуска — каждое наше приложение выпускалось раз в неделю,
- Перед выпуском все функции были объединены в ветку разработки, которую затем мы протестировали, исправили и отправили в производство.
- Каждый выпуск был полностью протестирован нашим QA-инженером, который дал команде зеленый свет 🚦 для запуска,
- Мы не освобождались по пятницам, чтобы хорошо выспаться на выходных.
Сегодня этот процесс кажется далеким от совершенства. Но после нескольких лет в хаотической среде, похожей на стартап, это сослужило нам хорошую службу. У нас был регулярный цикл релизов, что повысило предсказуемость инженерной работы. Еженедельный цикл релизов вынуждал нас выпускать вещи небольшими порциями, которые было легче тестировать и генерировать меньше ошибок. И хотя со временем мы столкнулись с некоторыми ошибками, мы смогли выявить и исправить их гораздо быстрее. Быстрый и стабильный цикл выпуска также помог нам распараллелить нашу работу, поэтому наши фронтенд-инженеры могли одновременно работать над другой частью нашего продукта.
Но этот процесс имел ряд серьезных ограничений. Согласно правилу «в пятницу выпусков не будет», разработка должна была быть завершена в среду, а тестирование и выпуск запланированы на четверг. Если мы находили какие-либо ошибки, то либо исправления делались в спешке, либо релизы переносились на следующую неделю.
Автоматизация тестирования выпущенных функций осталась в бэклоге из-за нехватки времени. Наш процесс тестирования был в основном сосредоточен на ручных проверках. Да, это довольно противоречиво — мы не смогли построить автоматизацию, которая увеличила бы нашу скорость. Мы не успели сэкономить время 🤷♀️. Так почему это было?
С фиксированным циклом выпуска и одной веткой разработки наша очередь тестирования и выпуска начала расти. В часы пик мы объединяли многие функции в разработку (не говоря уже о других, ожидающих объединения). Несмотря на то, что еженедельный цикл релизов был удобен для разработчиков программного обеспечения и приводил к небольшим изменениям, вещи складывались в большие кандидаты на релизы. Нашей инженерной команде QA очень часто приходилось тестировать несколько функций, даже не связанных друг с другом.
Результаты?
- Наши ветки функций провели более 40 часов на этапе тестирования (медиана для статуса «в тестировании»). В худшем случае этот процесс может занять сотни часов.
- В нашей очереди тестирования и выпуска было несколько десятков функций, которые находились в ветках функций, иногда даже в течение нескольких недель.
- Количество изменений, не прошедших фазу «в тестировании», начало неконтролируемо расти (хотя многие из них были «изменениями в 1 строку», риск появления багов в продакшене рос)
Наш процесс контроля качества и выпуска сегодня
За последние годы мы улучшили наши процессы доставки и пришли к следующим принципам:
- Разработка и тестирование выполняются на ветках функций — наш подход близок к разработке на основе магистралей, с короткоживущими ветками функций, которые полностью тестируются, а затем развертываются непосредственно в рабочей среде.
- Мы можем выпускать функции практически сразу после завершения разработки — не больше недельного цикла выпуска, не больше нескольких десятков часов, потраченных на «тестирование».
- Большинство выпусков не нужно проверять QA-инженерам — вручную или с помощью автоматических тестов. Благодаря культуре QA каждый инженер в равной степени отвечает за качество нашего продукта.
Сегодня, несмотря на то, что численность команды не изменилась, мы можем выпускать наше приложение несколько раз в день. Нет больше очереди тестирования и выпуска. Больше никаких развертываний в рабочей среде без тестирования кода. Поскольку все инженеры брали на себя ответственность за качество нашего продукта, мы сталкивались с меньшим количеством ошибок. И всякий раз, когда мы обнаруживаем какую-либо проблему на этапе тестирования, это не мешает другим разработчикам выпускать свои изменения (поскольку у нас нет единой ветки develop, где все функции объединяются перед окончательным этапом тестирования и выпуска).
По нашим данным, мы выпускаем в 2–3 раза чаще, чем два года назад.
Наши веб-приложения также более стабильны: большую часть времени безотказность превышает 99,9%.
Все эти достижения позволяют нам быстрее перерабатывать наш продукт и разблокировать такие инициативы, как автоматические обновления зависимостей, описанные ранее в нашем блоге.
Что мы сделали
Изменения в процессе доставки и переход от контроля качества к обеспечению качества не происходят в одночасье. Вот список инициатив и внедрений, которые помогли нам перейти от запланированных еженедельных выпусков к непрерывной доставке:
- Сосредоточьтесь на пирамиде тестирования, улучшив покрытие модульными тестами.
- Лучшая автоматизация функционального и сквозного тестирования:
- — Кроссбраузерное тестирование,
- — Визуальное регрессионное тестирование,
- — Сквозные тесты для пограничных сценариев
- Сосредоточьтесь на уменьшении шелушения
- Автоматизация сложных потоков тестирования (например, потоки электронной почты, протестированные с помощью Mailosaur)
В следующем посте блога мы подробно рассмотрим каждый из них.
Следите за обновлениями!
Благодарности
Все наши достижения, описанные в этой серии статей, были бы невозможны без тяжелой работы всей команды веб-инженеров. Самые большие заслуги принадлежат Агне Баранаускайте, инженеру по обеспечению качества, и Артуру Кании, менеджеру по разработке программного обеспечения. Вместе с веб-командой они заложили основу для изменений, описанных в этой серии.
К финансовым услугам, доступным для всех
Мы работаем во всей компании, чтобы создавать более быстрые, дешевые и более доступные финансовые услуги по всему миру, и вот некоторые из методов, которые мы используем. Нам еще предстоит пройти долгий путь, и если вы хотите принять участие в этом путешествии, загляните на нашу страницу вакансий.