Привет, Хабр! Меня зовут Ксения Сергеева, я QA-инженер в компании SM Lab, IT-компания Спортмастера. Сейчас работаю с мобильным приложением для продавцов, а за последние несколько лет успела потрудиться на благо финтеха и сервисов топливной компании. И, конечно, на каждом из проектов я сталкивалась с проведением регрессионного тестирования.

Что самое креативное в работе QA-инженера? Тестировать новую функциональность. Что самое скучное в работе QA-инженера? Гонять регресс. Здесь со мной могут не согласиться нелюбители писать документацию, но и в таком случае прохождение регресса занимает почетное второе место в списке самых занудных активностей QA.

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

А еще регрессу как правило сопутствует куча ограничений. Сдвинулись сроки передачи фичи в тест? Время на регресс уменьшилось. Близится конец периода, а мы не все успеваем? Режем регресс. Коллега ушел на больничный и рук не хватает? Ну, вы понимаете.

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

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

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

Я сформулировала шесть основных подходов к работе со временем и набором регресса, плюс еще несколько нюансов, которые могут помочь. Рассмотрим их плюсы и минусы. Погнали!

1. Увеличиваем интервал между релизами
1. Увеличиваем интервал между релизами

Вариант первый, самый, казалось бы, простой. Увеличиваем интервал между релизами и тем самым снижаем удельный вес регресса относительно остальных наших активностей. Условно: если регресс занимает 5 рабочих дней команды, то при релизе 1 раз в месяц мы тратим на регрессионное тестирование 15 дней за квартал, а при релизе раз в 1,5 месяца — 10 дней за квартал. Экономия 33%.

Минусы подобного подхода:

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

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

2. Проверяем только критичный и/или популярный функционал
2. Проверяем только критичный и/или популярный функционал

Вариант второй: проверяем только критичную и/или популярную функциональность. Например, если у нас приложение платежей за электроэнергию, то нам обязательно нужно проверять, что у нас работает функционал оплаты, а вот тестированием верстки справочника видов электросчетчиков можно пренебречь. Тут уже экономия ресурсов составит от скромных 5-10% до почти 90%.

Что стоит иметь в виду при использовании такого подхода?

  • То, что не тестируете вы — тестируют ваши пользователи. И готовы ли вы испытывать на прочность их лояльность — решать вам. 

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

  • По закону всемирных неудач, что-то сломаться в непроверяемом месте может в самый неподходящий для этого момент.

3. Проверяем только те модули, в которые вносились изменения.
3. Проверяем только те модули, в которые вносились изменения.

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

Какие риски?

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

  • Образуется слепая зона в вашем продукте, относительно которой не будет уверенности, что там все работает. + вспоминаем пункты про тестирование пользователями и всемирные неудачи.

4. Проверяем самые проблемные модули.
4. Проверяем самые проблемные модули.

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

Что насчет сложностей?

  • Чтобы определить проблемный кусок, нужны какие-то данные: статистика по багам, учет времени разработки (например, если оно часто затягивается и не укладывается в оценку), переписки, воспоминания и впечатления от разговоров на дейли — в общем, надо как-то отслеживать ситуацию. Для этого желательно использовать какой-то инструмент с возможностью сбора объективных данных, вроде тех же метрик по количеству дефектов, возвратов задач на доработку, времени задачи в статусе “в работе”. Хорошо, если этот инструмент уже есть и настроен, сложно, если это только предстоит сделать. В качестве альтернативы можно рассмотреть экспертный подход, но для него нужно быть достаточно хорошо погруженным продукт и работу над ним, то есть тоже с бухты-барахты не применишь.

  • Риски слепой зоны все так же остаются с нами.

5. Оставляем только позитивные проверки
5. Оставляем только позитивные проверки

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

Минусы:

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

6. Ааааавтоматизация
6. Ааааавтоматизация

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

Но, как всегда, есть нюансы:

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

  • На то, чтобы поднять автотестирование на проекте, нужно время. Так что по щелчку решить проблему не получится и до ближайшей экономии времени на регрессе еще как минимум пара месяцев (а на самом деле больше).

  • Не все кейсы автоматизируются, так что часть все равно останется на совести мануальных проверок.

  • Покрывать автотестами имеет смысл уже стабильный и нечасто меняющийся функционал. Есть такой на проекте? Хорошо. Все меняется через каждые 5 минут? Нууу, сами понимаете.

  • Мало один раз поднять автотесты, их надо еще поддерживать. И мы опять возвращаемся к теме бюджетов и ресурсов.

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

Что нам может помочь еще?
Что нам может помочь еще?

Что нам может помочь еще?

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

Во-вторых, индивидуальное определение тестового набора для каждого релиза. Если мы катим быстрый хотфикс, в котором исправили один экран — скорее всего, можно пренебречь проверками всего остального. В релиз вошло 100500 задач, да еще и смежные системы задействованы? Да уж, простым смоуком мы в таком случае не обойдемся — надо гнать максимально полный регресс. Трогали только один модуль — базовые проверки + регрессим модуль.

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

В-четвертых, часть регрессионного тестирования можно делегировать представителям бизнеса и/или дизайнерам в рамках проведения авторского надзора. Всегда существуют риски, что в процессе разработки кто-то кого-то не так понял, а на авторском надзоре от бизнеса это достаточно быстро выясняется. Из минусов — большая стоимость переделок по замечаниям. Если говорить про авторский надзор от дизайнера, то он позволяет QA-специалистам тратить меньше времени на pixel perfect и на нефункциональные проверки (например, на UX-тестирование). Главное —не злоупотреблять этим и заранее проговорить зоны ответственности каждого.

Резюмирую

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

  1. Держите голову в холоде, ноги в тепле, а регрессионную модель — в порядке.

  2. Соблюдайте баланс между обилием проверок, их необходимостью и достаточностью.

  3. Подбирайте тестовые регрессионные наборы индивидуально для каждого релиза (или типизируйте их).

  4. Автоматизируйте все то, что можно автоматизировать.

  5. Делегируйте то, что можно делегировать.

  6. И вообще, делайте хорошо — плохо не делайте :-)

А что помогало вам сократить регрессионное тестирование с сохранением нужного уровня качества?

Комментарии (6)


  1. Constantine_11
    22.10.2024 14:40

    Спасибо, полезные идей, которые можно прикинуть к своим проектам.

    В-четвертых, часть регрессионного тестирования можно делегировать представителям бизнеса и/или дизайнерам в рамках проведения авторского надзора.

    Орнул с этого предложения. Ответственность за баги на проде тоже на ПМа и дизайнера повесим? Скорее всего ответ дизайнера на просьбу еще поискать еще раз баги в своей таске, которая была принята и закрыта будет такой:


    1. kseser Автор
      22.10.2024 14:40

      Ответственно за баги на проде лежит на всей команде. (Я напомню, что QA баги не делают.)
      Пока еще ни разу не сталкивалась с такой реакцией дизайнера на задачу авторского надзора. И ПМ/бизнес в рамках приемочного тестирования часть регресса тоже прогоняет. Поэтому не вижу здесь какой-то потенциально конфликтной ситуации. Если конечно не тестировать тяп-ляп в надежде на то, что "да ладно, там дизайнер сам посмотрит".


  1. VadimNich
    22.10.2024 14:40

    • Всегда не забываем про Смоук.

    • Не всегда есть возможность автоматизировать и в таком случае проверяем этими ручками вот этими ручками..

    • Всегда каждый регресс делается с учётом введённого нового функционала. - это сокращает время прогона.

      Вывод:

    • Смоук + ограниченное хорошо проанализированое регрессивное тестирование относящееся к изменению функционала.

    • Обновлять регрессионную библиотеку согласно новому функционалу (желательно сразу за этим следить)

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

    • Как дополнение энвайронменты должны так же поддерживаться соответственно и соответствовать.. если регресс проводят в QA env это одни риски если UAT env другие.. Всегда помните о том, что когда вы идёте в PreProd env а это копия Prod env. у вас это финальная репетиция на этой стадии отдавать можно специфики которые не вылезли в предыдущих енв но в PreProd гоняется Смоук основных функциональностей + нового функционала

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

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

      Надеюсь мои комментарии были полезны... :) буду рад поделиться своим опытом..


    1. kseser Автор
      22.10.2024 14:40

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


  1. debonair_heathen
    22.10.2024 14:40

    Спасибо за статью, интересно

    Пункты 2-4 выглядят как часть подхода из мнемоники по выбору тестов для набора RCRCRC, сам пользуюсь ей в работе, рекомендую

    Термин «авторский надзор» вижу впервые, тут подразумевался UAT/дизайн-ревью или нечто иное?

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


    1. kseser Автор
      22.10.2024 14:40

      На прошлых проектах дизайнер периодически себе ставил свежую версию приложения и проходил по всем флоу и экранам, смотрел, чтобы всякие отступы-выступы были на своих местах, нужные оттенки серого цветов использовались, верстка не съезжала и все такое. Заодно еще UX смотрел - удобно ли пользоваться, например, везде ли выезжает нужная клавиатура по тапу на поле ввода (где числовая, где буквенная), кнопки над клавиатурой поднимаются (на тех экранах, где надо) - и все в таком духе.
      На нынешнем проекте только внедряем эту активность, пока прошла первая итерация: дизайнер подсветил нам те мелочи, на которые у QA уже замылился глаз.