Все статьи

Автоматизированное тестирование бэкенда

Рассказываем как и зачем мы пишем автотесты для бэкенда наших проектов и что нам это дает.

Бэкенд большинства проектов, которые мы реализуем, существует в формате Rest API. Одна из прелестей такой архитектуры заключается в том, что такой бэкенд можно и нужно покрывать автотестами.

Когда следует покрывать бэкенд автотестами

Всегда. Мы убеждены в этом.

Если архитектура проекта позволяет автоматизировать тестирование бэкенда - нужно автоматизировать, безальтернативно.

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

Из нашей практики, особенно хорошо внедренные автотесты дают о себе знать на проектах, где разработка длится несколько месяцев. На поздних этапах разработки при внедрении нового функционала всё время повышается вероятность "сломать" старый функционал, который был реализован несколько месяцев назад.

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

Мы автоматизируем тестирование бэкенда везде, где позволяет архитектура. Независимо от бюджета на проект.

Как реализуется автоматизированное тестирование

Для автоматизации тестирования бэкенда мы используем PHPUnit. Расскажу в сокращенном виде, как всё работает на примере деплоя на dev-окружение. Для описания в деталях всего процесса, мы подготовим отдельную статью.

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

Для автоматизации прогона тестов мы используем функционал CI/CD в GitLab. Тесты запускаются при каждой попытке деплоя. При каждом обновлении код проекта разворачивается на специальном dev-стенде и тесты запускаются на нем.

608b0df0a31a46488538069075a0d1c9.png
Типичный pipeline в нашем GitLab - тесты прошли успешно


608b0df0a31a46488538069075a0d1c9.png
Тесты завершены с ошибкой


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

608b0df0a31a46488538069075a0d1c9.png
Уведомление в Slack об ошибке при выполнении автотестов


Соответственно, если проектная команда видит, что выполнение тестов завершилось с ошибками, то происходит анализ отчета о тестировании (детальные логи также доступны в GitLab) и возникшие ошибки оперативно устраняются.

Таким образом, при реализации каждой новой функциональности регрессионно проверяется весь разработанный ранее функционал. Минимизируется вероятность попадания ошибок на production-стенд. Уменьшается влияние человеческого фактора на процесс разработки.

Не очевидные плюсы автоматизированного тестирования

1. Дополнительный рубеж самопроверки для разработчиков. При написании тестов на собственный функционал, разработчик вынужден взглянуть на него "со стороны", ещё раз проанализировать возможные сценарии его использования.

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

3. Если процессы в команде отлажены - увеличение стоимости разработки несущественно даже в рамках отдельно взятой задачи.

Читайте также

Параметризованные сборки в GitLab
Параметризованные сборки в GitLab
Понятие параметризованных сборок очень популярно в Jenkins — это функционал, который позволяет запускать сборки с пользовательскими параметрами. Это значительно расширяет возможности автоматизации и делает процессы более гибкими. Одна из ключевых задач, для которой этот функционал может применяться, — тестирование функционала в разных окружениях. Можно запускать тесты на окружении (например, dev, staging, test), просто задавая нужные параметры. Разбираем эту тему в нашей статье.
Внедряем DevSecOps в процесс разработки. Часть 5. Этап Deploy-time Checks, обзор инструментов
Внедряем DevSecOps в процесс разработки. Часть 5. Этап Deploy-time Checks, обзор инструментов
В предыдущей части рассказали о тестировании функционала на уязвимость до его попадания на продакшн. По итогам предыдущих статей мы можем проверить код на безопасность, собрать безопасные билды, проверить функционал на наличие уязвимостей. Теперь можно разворачивать приложение на продакшне.
Внедряем DevSecOps в процесс разработки. Часть 4. Этап Test-time Checks, обзор инструментов
Внедряем DevSecOps в процесс разработки. Часть 4. Этап Test-time Checks, обзор инструментов
В предыдущих статьях разобрали три этапа DevSecOps — Pre-commit Checks, Commit-time Checks, Post-build Checks. В четвертой статье поговорим о следующем этапе — Test-time Checks.
Магия динамического маппинга. Реализация универсальной обработки файлов нефиксированной структуры на Python
Магия динамического маппинга. Реализация универсальной обработки файлов нефиксированной структуры на Python
Один из проектов, с которым мы работаем — IBP-платформа для планирования и прогнозирования спроса и продаж в ритейле. В статье поговорим о конкретной реализации для одной из задач в рамках этой платформы на Python и Django. При этом сама концепция может быть реализована абсолютно на любом фреймворке или платформе: Spring, .NET, Laravel.