Что такое регрессионное тестирование
Регрессионное тестирование — это процесс проверки того, что ранее работавший функционал продолжает корректно работать после внесения изменений в код. Термин «регрессия» означает откат назад: новый код может сломать старые фичи. Основная цель — обнаружить баги, которые были внесены изменениями, и убедиться, что продукт остаётся стабильным.
В отличие от ретестирования, которое проверяет, что конкретная ошибка исправлена, регрессия охватывает всю систему или её критичные части. Например, после добавления новой функции фильтрации товаров в интернет-магазине нужно убедиться, что кнопка «Добавить в корзину» и поиск по-прежнему работают.
Регрессионное тестирование — это не разовое действие, а постоянный процесс, который сопровождает каждый цикл разработки. Особенно важно оно в условиях непрерывной поставки (continuous delivery), когда релизы выходят часто.
Зачем нужно регрессионное тестирование
Основная причина — изменения в коде неизбежно несут риск поломки существующего функционала. Даже небольшой фикс бага или рефакторинг могут затронуть связанные модули. По данным исследований, регрессионные баги считаются одними из самых дорогостоящих для исправления в production.
С ростом приложения количество потенциальных взаимодействий между фичами растёт экспоненциально. Если в системе 10 фич, то возможных точек взаимодействия около 45, а при 50 фичах — уже более 1200. Ручное тестирование не может стабильно покрыть все эти сценарии.
Регрессионное тестирование даёт уверенность для частых релизов. Без него команда рискует выпускать обновления, которые ломают уже работающие функции. Это особенно критично для продуктов, где стабильность напрямую влияет на доход и репутацию.
Когда запускать регрессионные тесты
Регрессионное тестирование проводят в нескольких ключевых точках жизненного цикла разработки:
- После каждого изменения кода — в CI/CD пайплайнах регрессию запускают автоматически на каждый pull request. Это позволяет ловить проблемы до мержа.
- Перед релизами — полный regression suite запускается перед выкатом на production. Обычно процесс выглядит так: разработка → smoke-тесты (быстро), pull request → core regression (средне), staging → full regression (полно), production → smoke-тесты после деплоя.
- После исправления багов — нужно проверить, что баг действительно исправлен и фикс не сломал ничего другого. Например, если исправляли логин со спецсимволами, стоит перепроверить, что выход из системы и сброс пароля тоже работают.
Также регрессию проводят после обновления зависимостей, смены конфигурации окружения или миграции данных.
Типы регрессионного тестирования
Различают несколько подходов к регрессионному тестированию в зависимости от объёма и целей:
- Корректирующая регрессия — перезапуск существующих тестов без изменений, когда код меняется, но требования остаются прежними. Например, после оптимизации производительности.
- Прогрессивная регрессия — обновление тестов, когда меняются и код, и требования. Например, если логин теперь требует двухфакторную аутентификацию, нужно модифицировать старые тесты и добавить новые.
- Селективная регрессия — запуск только тестов, связанных с изменёнными областями. Это эффективно для больших test suite. Например, если изменения коснулись только модуля checkout, можно запустить тесты checkout и cart, пропустив profile и search.
- Полная регрессия — запуск всего test suite. Используется для мажорных релизов, значительного рефакторинга или после долгих периодов разработки.
Выбор метода зависит от размера проекта, частоты релизов и доступных ресурсов.
Как создать эффективный regression suite
Формирование набора регрессионных тестов — ключевая задача. Не стоит включать в него все существующие тесты, иначе регресс займёт слишком много времени. Лучше разделить тесты на две части: ядро регресса и тесты нового функционала.
Ядро регресса должно включать:
- Критичные пользовательские пути (регистрация, логин, оформление заказа, оплата).
- Часто используемые функции.
- Функционал, критичный для дохода.
- Ранее багованные области.
- Сложные интеграции.
Тесты нового функционала — это проверки, связанные с новыми фичами и исправленными багами. Обычно их не больше десяти на спринт.
Важно регулярно чистить suite: удалять или исправлять тесты, которые стали flaky, тестируют устаревшие фичи, дублируют другие или дают мало ценности. Квартальный ревью может сократить время прогона на 15–20% и повысить надёжность.
Правила оформления тестов для регресса
Чтобы тесты было легко проходить и поддерживать, стоит соблюдать несколько простых правил:
- Тест не должен зависеть от другого теста. Если нужен предварительно созданный объект, опишите его отдельно.
- В описании указывайте логин и пароль пользователя, который работает в системе.
- Чётко прописывайте, как заполнять поля в данных теста. Если поле необязательное, это должно быть отмечено.
- Один шаг — одно действие. Исключение — переходы по страницам.
- Если тест требует загрузки файла, прикрепите образец.
- Избегайте размытых формулировок вроде «попробовать».
- Не используйте «в альтернативном случае» — для этого нужен отдельный тест.
- Если упоминается запрос к БД, пропишите его полностью.
- Не смешивайте front и back части в одном тесте.
- Шагов в тесте должно быть не больше 10–12.
- Тест должен касаться одной предметной области.
Соблюдение этих правил делает тесты понятными, воспроизводимыми и удобными для автоматизации.
Автоматизация регрессионного тестирования
Автоматизация регресса — логичный шаг, так как это повторяющийся процесс, критичный для качества. Однако начинать автоматизацию стоит не сразу. На ранних этапах разработки, когда код активно меняется, поддержка автотестов может быть дороже ручного тестирования.
Оптимальный момент — когда появился хотя бы один стабильный модуль, вероятность изменения которого низка. В этом случае время на прохождение регресса снижается без большого прироста расходов на правки.
Для автоматизации используют пирамиду тестов:
- Unit-тесты (много) — проверяют ключевую бизнес-логику и утилитарные функции.
- Интеграционные тесты (средне) — проверяют API-контракты и взаимодействие компонентов.
- E2E-тесты (мало) — проверяют критические user journeys и smoke-сценарии.
Параллельное выполнение тестов позволяет значительно ускорить прогон. Например, разбив suite на 4 шарда, можно получить ускорение примерно в 4 раза. Также полезны инструменты умного выбора тестов, которые запускают только тесты, связанные с изменёнными файлами.
Интеграция регрессионного тестирования в CI/CD
Для эффективной работы регрессионные тесты должны быть встроены в пайплайн непрерывной интеграции и доставки. Типичный пайплайн включает несколько этапов:
- Unit-тесты — быстрая проверка на каждом коммите.
- Интеграционные тесты — запускаются после успешного прохождения unit-тестов.
- Регрессионные тесты — запускаются после интеграционных и блокируют деплой при падении.
- Деплой — выполняется только после успешного прохождения всех тестов.
Когда регрессионные тесты падают, важно:
- Заблокировать деплой.
- Исследовать проблему сразу, пока контекст свеж.
- Исправить или откатить изменения, а не отключать тест.
- Добавить покрытие для предотвращения подобных регрессий в будущем.
Типичные проблемы при интеграции — медленные test suite и flaky-тесты. Для медленных suite помогает параллелизация и запуск полного набора ночью, а для flaky-тестов — изоляция в карантин и добавление retry с порогом падений.
Сколько тестов должно быть в регрессе
Оптимальное количество тестов в регрессе зависит от размера команды и времени, отведённого на регресс. При спринте в две недели на регресс обычно отводится 1–2 дня.
Примерный расчёт: средний тест из 10 шагов занимает около 20 минут с учётом предусловий и оформления багов. За час тестировщик проходит примерно 3 теста, за день — около 24. В реальности с учётом других задач получается 10–20 тестов в день.
Если в команде два тестировщика и на регресс отведено два дня, то оптимальное количество тестов — около 80. Этого достаточно для практически полного покрытия на среднем проекте.
Важно помнить, что качество тестов важнее количества. Лучше иметь 80 хорошо продуманных тестов, покрывающих критичные пути, чем 200 хаотичных проверок.
Типичные проблемы и как их решать
На практике команды сталкиваются с несколькими распространёнными проблемами:
Медленные test suite. Полная регрессия может занимать часы. Решение — параллелизация, запуск подмножества на PR и полного набора ночью, оптимизация медленных тестов.
Flaky-тесты. Тесты, которые проходят или падают случайно, подрывают доверие к регрессу. Рекомендуется изолировать их в карантин, исправить или удалить после нескольких падений, добавить retry.
Поддержка тестов. Если тесты ломаются с каждым изменением, значит, они слишком хрупкие. Используйте стабильные селекторы (data-testid), тестируйте поведение, а не реализацию, создавайте общие тестовые утилиты.
Непонимание, какие тесты выбирать. Часто тестировщики включают в регресс все тесты подряд. Правильный подход — фокус на критичных путях и приоритизация по риску.
Регулярный аудит и чистка suite помогают поддерживать его в актуальном состоянии и повышают эффективность регресса.
Вопросы и ответы
В чём разница между регрессионным тестированием и ретестированием?
Ретестирование — это проверка, что конкретная ошибка исправлена. Регрессионное тестирование — это проверка, что исправление не сломало другой функционал. Например, после фикса бага в логине ретест проверит только логин, а регресс — ещё и корзину, поиск и другие модули.
Нужно ли автоматизировать регрессионное тестирование?
Да, автоматизация регресса — лучшая практика, особенно для частых релизов. Однако начинать автоматизацию стоит не сразу, а когда появится стабильный модуль. Автоматизация ускоряет прогон, повышает повторяемость и снижает риск человеческой ошибки.
Как создать эффективный regression suite?
Начните с критичных пользовательских путей (логин, корзина, оплата). Приоритизируйте по риску: часто используемые фичи, критичный для дохода функционал, ранее багованные области. Регулярно чистите suite от flaky и устаревших тестов. Поддерживайте тесты в аккуратном состоянии.
Когда нужно запускать регрессионные тесты?
После каждого изменения кода (в CI/CD), перед релизами, после исправления багов, после обновления зависимостей или смены конфигурации. Чем критичнее релиз, тем тщательнее должно быть тестирование.
Сколько тестов должно быть в регрессе?
Оптимальное количество зависит от команды и времени. При двух тестировщиках и двух днях на регресс — около 80 тестов. Важно не количество, а покрытие критичных путей. Лучше 80 качественных тестов, чем 200 хаотичных.
Что такое flaky-тесты и как с ними бороться?
Flaky-тесты — это тесты, которые проходят или падают случайно без изменения кода. Они подрывают доверие к регрессу. Решения: изолировать в карантин, исправить или удалить после нескольких падений, добавить retry с порогом падений.
Как интегрировать регрессионное тестирование в CI/CD?
Добавьте этап регрессионных тестов в пайплайн после unit и интеграционных тестов. Настройте блокировку деплоя при падении. Используйте параллельное выполнение и умный выбор тестов для ускорения. При падении — исследуйте сразу и не отключайте тест.