Стратегия автоматизации тестов
Считаем на реальных числах. Регресс из 40 кейсов руками - это 8 часов. Автоматизировать их, по 45 минут на кейс, - 30 часов разово. Кажется, окупится на четвёртом прогоне. Но если добавить поддержку тестов (обычно около 20% от написанного в месяц, то есть 6 часов) и релизить раз в месяц, окупаемость уезжает на 15 месяцев. Релизишь раз в неделю - 1,2 месяца.
Стержень: окупаемость автотеста определяется частотой прогона и ценой поддержки, а не количеством написанных тестов.
// Формулировки: «что автоматизировать, а что руками?», «как считать окупаемость автотестов?», «почему не всё через интерфейс?».
Замер окупаемости
Разложу тот счёт целиком, потому что он и есть ответ на вопрос «зачем автоматизировать». ROI (return on investment, окупаемость вложений) считается так: экономия минус затраты. Экономия - цена ручного прогона, умноженная на частоту. Затраты - разработка один раз плюс поддержка каждый месяц.
Подставляем 8 часов ручного прогона, 30 часов на разработку, 6 часов поддержки в месяц. Релиз раз в месяц: экономия 8 минус поддержка 6 - остаётся 2 часа в месяц, окупаемость 15 месяцев. Релиз раз в неделю: 32 минус 6 - остаётся 26 часов, окупаемость 1,2 месяца. Релиз каждый день: 154 часа экономии, окупаемость меньше недели. Одни и те же тесты, разница только в частоте прогона.
// И обратный случай: если продукт штормит и поддержка съедает не 20%, а половину (15 часов в месяц), то при релизе раз в неделю окупаемость растягивается с 1,2 до 1,8 месяца. Отсюда правило: чем чаще гоняется и чем стабильнее объект проверки, тем выгоднее автоматизировать. Тест на фичу, которую переписывают каждую неделю, не окупится никогда.
- ROI
- return on investment: экономия от прогонов минус разработка и поддержка
- цена поддержки
- часы на починку тестов после изменений продукта, каждый месяц
Что автоматизируют и на каком уровне
Из формулы окупаемости прямо следует, что брать. Многократное и стабильное: регрессионный набор (перепроверка того, что работало раньше), смоук на каждую сборку (быстрая проверка, что приложение вообще живое), проверки договора между сервисами (что один отдаёт ровно то, чего ждёт другой), критичные денежные пути. Разовое, исследовательское и меняющееся каждую неделю остаётся руками.
Второй вопрос - на каком уровне проверять. Я замерял одну и ту же проверку расчёта корзины: прямой вызов функции 1,2 микросекунды, через реальную базу 13,9 микросекунды, через сетевой вызов к серверу 507 микросекунд. Разница в 422 раза, и это ещё без браузера. Отсюда правило: логику проверяем на самом нижнем уровне, где это возможно, а через интерфейс гоняем считанные сценарии целиком.
// Уровни различаются ещё и ценой написания с поддержкой, а она обычно больше цены прогона: тест на функцию не зависит ни от вёрстки, ни от сети, а тест через интерфейс ломается от любого редизайна. Поэтому «автоматизировать всё через интерфейс» - самый дорогой из возможных способов получить самый нестабильный набор.
- кандидат на автоматизацию
- проверка, которая гоняется часто и меняется редко
- выбор уровня
- логику - функциями, договоры - вызовами, интерфейс - единицы сценариев
Поддержка - главная скрытая статья
Почему поддержка так дорога, лучше всего видно на замере. Я взял экран оплаты и шесть разных способов найти на нём кнопку. Потом изменил вёрстку - разметку страницы - так, как её меняют при обычном редизайне: добавил блок-обёртку, переименовал класс оформления, поменял кнопки местами, удлинил надпись. Из шести способов пережили редизайн два.
Автотест - это код, который живёт вместе с продуктом. Значит, ему нужно то же, что коду: чтение коллегой перед вливанием, единый стиль, регулярная чистка и владелец, который его чинит. Скрипт, написанный на коленке и оставленный без хозяина, умирает за квартал - не потому что плохо написан, а потому что продукт уехал вперёд.
// Метрики набора собирают под решение: время прогона, доля нестабильных падений, сколько настоящих поломок поймано, сколько дефектов утекло мимо набора в прод, то есть в боевую среду к живым пользователям. А вот «количество автотестов» не значит ничего: тысяча тестов, которым команда не верит, хуже сотни, на которые она опирается при выкатке.
- автотест как код
- ревью, стандарты, владелец; иначе умирает за квартал
- пустая метрика
- число тестов растёт, а решений на нём не принимают
Как отвечать: «Что автоматизировать, а что оставить руками?»
Решаю счётом, а не по ощущению. Экономия от автотеста - это цена ручного прогона, умноженная на частоту, а затраты - разработка один раз плюс поддержка каждый месяц. Считал на живом примере: регресс из сорока кейсов руками занимает восемь часов, автоматизировать их - около тридцати часов, поддержка примерно шесть часов в месяц. При релизе раз в месяц такая автоматизация окупается через пятнадцать месяцев, а при релизе раз в неделю - через полтора. То есть решает частота прогона. Поэтому автоматизирую регресс, смоук на каждую сборку, проверки договоров между сервисами и критичные денежные пути. Оставляю руками исследовательское тестирование, разовые проверки и фичи, которые ещё активно меняются - тест на такую фичу переписывается быстрее, чем окупается. Уровень выбираю по цене: я мерил одну и ту же проверку - прямой вызов функции против вызова через сеть, разница в четыреста с лишним раз. Значит, логику проверяю на нижнем уровне, а через интерфейс гоняю несколько критичных сценариев. И всегда закладываю поддержку в оценку, потому что после редизайна из шести способов найти кнопку у меня выжило два.
Почему это сильный ответ: критерий назван формулой и подкреплён счётом, где ответ меняется от частоты релизов; выбор уровня обоснован замером; поддержка учтена как отдельная статья.
На чём валят
- −Считать окупаемость без поддержки: при релизе раз в месяц она превращает 4 прогона в 15 месяцев.
- −Автоматизировать фичу, которую переписывают еженедельно, - тест не доживёт до окупаемости.
- −Гнать всё через интерфейс: та же проверка стоит в сотни раз дороже и ломается от любого редизайна.
- −Отчитываться количеством автотестов - тысяча, которым не верят, хуже сотни надёжных.
- −Оставить набор без владельца: продукт уезжает вперёд, и за квартал тесты умирают.
Проверьте себя
Пять вопросов из банка по этой подтеме. Всего их 13, остальные разбираются в тренажёре.
- Какие проверки автоматизируют в первую очередь?A)Самые сложные и редко выполняемые сценарии, которые тяжело пройти вручную один разB)Проверки внешнего вида и удобства интерфейса, которые субъективно оценивает пользовательC)Стабильные повторяемые сценарии, которые гоняют частоD)Функционал, который сейчас активно меняется от спринта к спринту в разработке
показать ответ и разбор
+C)Стабильные повторяемые сценарии, которые гоняют часто// разбор: Автоматизация окупается там, где тест выполняется многократно и предсказуемо. Первые кандидаты — регрессионный набор (перепроверяется на каждый релиз), дымовые проверки (гоняются на каждый билд) и критичные бизнес-пути (логин, оформление заказа), где цена дефекта высока. Такие сценарии стабильны, часто повторяются и дают максимум экономии ручного труда на автоматизацию. А вот часто меняющийся или разовый функционал автоматизировать рано — поддержка съест выгоду.
- Как соотносятся автоматизированное и ручное тестирование?A)Автоматизация со временем вытесняет ручное тестирование и делает тестировщика ненужнымB)Ручное тестирование быстрее автоматического, поэтому регресс тоже гоняют рукамиC)Автоматизация подходит для юзабилити, а ручное — для нагрузочных прогонов системыD)Автоматизация закрывает повторяемый регресс, а ручное сильнее в исследовательском и разовом тестировании
показать ответ и разбор
+D)Автоматизация закрывает повторяемый регресс, а ручное сильнее в исследовательском и разовом тестировании// разбор: Это не соперники, а дополняющие подходы. Автоматизация незаменима для повторяемых, объёмных и рутинных проверок: регресс на каждый релиз, прогон сотен кейсов за минуты, нагрузка. Ручное тестирование сильнее там, где нужны человеческие суждение и гибкость: исследовательское тестирование, оценка юзабилити и вёрстки, разовые проверки новой фичи, ситуации с неполной спецификацией. Зрелый процесс сочетает оба: авто держит регрессионную сетку, человек ищет неожиданное и оценивает то, что машине недоступно.
- Что за антипаттерн «стакан мороженого» (ice-cream cone)?A)Перевёрнутая пирамида: много медленных e2e и мало unitB)Идеальная стратегия покрытия, при которой все проверки выполняются через интерфейс целикомC)Схема, где unit-тестов больше всего, а e2e сведены к минимуму на вершинеD)Приём кэширования результатов e2e-тестов между прогонами ради ускорения набора
показать ответ и разбор
+A)Перевёрнутая пирамида: много медленных e2e и мало unit// разбор: «Стакан мороженого» — перевёрнутая тестовая пирамида: основную массу проверок делают через медленные и хрупкие e2e/UI-тесты, а быстрых unit почти нет (иногда сверху ещё «шапка» из ручных проверок). Итог болезненный: набор гоняется долго, часто флакает, при падении не локализует причину, а поддержка съедает время команды. Обратная связь становится медленной и ненадёжной. Лечение — сдвиг проверок вниз: покрывать логику unit-тестами, а e2e оставить на несколько критичных сквозных сценариев.
- Что обычно не стоит автоматизировать?A)Регрессионные проверки, потому что они повторяются на каждом релизе и потому рутинныB)Разовые проверки, часто меняющийся UI, а также юзабилити и вёрстку «на глаз»C)Дымовые проверки на каждый билд, так как их достаточно пройти один раз вручнуюD)Критичные бизнес-пути вроде оплаты, ведь ошибка в них слишком дорого обходится
показать ответ и разбор
+B)Разовые проверки, часто меняющийся UI, а также юзабилити и вёрстку «на глаз»// разбор: Автоматизация окупается на повторяемом и стабильном. Плохие кандидаты: разовые проверки (написание автотеста дороже одного ручного прохода), часто меняющийся интерфейс (тест будет постоянно ломаться и требовать правок), оценка юзабилити и визуальной вёрстки (человек замечает «некрасиво/неудобно» лучше скрипта), капча и намеренно защищённые от автоматизации места. Автоматизировать их — значит вложить в поддержку больше, чем сэкономить. Такие проверки оставляют ручному и исследовательскому тестированию.
- Почему автоматизация не заменяет тестировщика полностью?A)Потому что автотесты пишутся медленно, и вручную проверять пока получается быстрееB)Потому что современные фреймворки автоматизации ещё не поддерживают веб-интерфейсыC)Автотесты проверяют лишь заранее заложенное; исследование, дизайн проверок и оценку риска ведёт человекD)Потому что автотесты выполняются лишь на тестовом стенде, а прод проверяют вручную
показать ответ и разбор
+C)Автотесты проверяют лишь заранее заложенное; исследование, дизайн проверок и оценку риска ведёт человек// разбор: Автотест проверяет ровно то, что в него запрограммировали, — он не задаёт новых вопросов и не замечает неожиданного вне своих ассертов. Проектирование самих проверок, исследовательское тестирование (поиск того, о чём не подумали), оценка юзабилити, приоритизация по риску, интерпретация странного поведения и решение «достаточно ли протестировано» — всё это требует человеческого суждения. Автоматизация снимает рутину и даёт быстрый регресс, освобождая тестировщика для творческой и аналитической работы, но не выполняет её за него. Поэтому «автотесты есть — тестировщик не нужен» — заблуждение.
дальше
Теорию прочитали. Навык ставится повторением
В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, лимит только на количество вопросов в день.