Как правильно готовить автоматизацию или Что покрывать тестами в первую очередь

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.
Привет, это Эрик Бурыгин, я техлид курса «Автоматизатор тестирования на Java» в Яндекс.Практикуме и лид в Яндексе. Каждый ручной тестировщик считает, что автоматизация — это круто и её непременно нужно втащить в проект. Что может быть лучше, чем полное покрытие автотестами продукта, когда тесты гоняются 24/7 и отлавливают баги? Вот прочитал я эти строки, и захотелось ещё раз всё заавтоматизировать!



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

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

Поймите, что автоматизировать в первую очередь


Для начала нужно чётко определиться с тем, что автоматизировать в первую очередь!

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

Давайте разберём все подводные камни такого пути на примере нашего проекта и пройдём путь ошибок и побед с самого начала.

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

Итак, мы делаем приложение по продаже кастомных байков Custom Bike для платформ iOS и Android. Полный регресс приложения — это 2500+ кейсов на платформу и примерно неделя человеко-часов. Для написания тест-кейсов мы используем Testpalm от Яндекса. Релизимся часто. Но как бы мы не стремились ускорить процесс выкладки, регрессы оставались узким местом. Тестировщики утопали в них, теряя всякую мотивацию. Конечно, можно было нарастить команду, но это путь вникуда, так как новые фичи выкатываются каждый релиз и регресс становится всё необъятнее.

Вот мы и решили втащить в проект автоматизацию и, как вы наверное догадались, начали с регресса, а именно — с регресса Android-приложения. Благо культура автоматизации тестирования в команде была на высоком уровне — на тот момент мы очень преуспели в автоматизации веба и API. Но как всегда, без ложки дёгтя не обошлось — наша экспертиза в автоматизации мобилок была близка к нулю, а изучать новое было проблематично, ибо задач и так хватало. Как сейчас помню фразу: «Чтобы автоматизировать Android, нужно становиться Android-разработчиком».

Однако нашлись энтузиасты, которые готовы были пробовать. Мы начали поднимать проект на Expresso, прикрутили Robot Pattern — и в путь! Мы занимались автоматизацией всё свободное время, так как рабочее было занято текущими задачами. Автоматизировали ночами дома, в барах, ресторанах и на пикниках. Так за месяц мы преодолели барьер в 30%, а через полгода вышли на 70% регресса. Круто — скажете вы. Да, круто. Однако нужно понимать, что больше ничем мы в своё свободное время не занимались, а со временем каждый процент регресса давался всё сложнее. Кейсы создавались постоянно, появлялись моменты, к которым просто так не подойти, к тому же нужно было качать инфраструктуру. Тесты начинали флакать, мы упирались в лимит ресурсов и технологий… Путь был неплох, но скажу честно — не у всех есть такой запал и временной ресурс.

Профит был, но мы всё равно не могли релизиться так часто, как хотели, а именно — выпускать релизы на каждой платформе раз в неделю. Начали думать и решили внедрить практику «смелых, до первой сломанной судьбы» — в каждом релизе пробегать не весь регресс, а проверять только места, где были изменения. Так у нас появились кастомные смоуки. В них входили дефолтные и критичные кейсы для приложения, а также кейсы на новые фичи и всё, что гипотетически могло быть затронуто. Этот подход хорош, но требует определённой экспертизы, потому что нужно обладать глубоким пониманием приложения и платформы и, конечно, уверенностью, что не выстрелит где-нибудь в неожиданном месте.

Кастомные смоуки дали хороший результат и сократили прохождение предрелизных кейсов до двух человеко-дней. Вы спросите: а как же 70% автоматизации? Дело в том, что смоук постоянно менялся, и не всегда тест-кейсы попадали в то, что уже было автоматизировано. К тому же автоматизация iOS находилась в зачаточном состоянии. При этом автотесты давали нехилую защиту от ошибок — перейдя на новый подход, некоторые из проверок мы стали делать очень редко.

Как понять, что автоматизировать


Мы не остановились на достигнутом и стали думать дальше: как быть ещё более эффективными, ускорить процесс и не потерять в качестве. После анализа смоуков и регрессов за несколько месяцев поняли, что некоторые кейсы повторяются чаще, а некоторые встречаются по одному разу. Один раз собрать статистику и всё посчитать используя, например, Excel — не проблема. Но делать это каждый раз и поддерживать актуальность достаточно трудозатратно. Мы решили автоматизировать сбор статистики.

Testpalm позволяет без проблем выгрузить весь пул кейсов, что у нас есть.
Это можно сделать с помощью Python и библиотеки Requests. Пример:

requests.get('http://testpalm.ru/testcases/custombike')

Список кейсов получен, но нам нужна статистика, а пока мало что можно посчитать. Чтобы посчитать статистику, нужны маркеры. Testpalm отлично с этим справляется — там есть теги, поэтому мы начали при каждом сборе смоука добавлять тег-версию релиза: Android_4.11, Android_4.12, Android_4.13 и т. д. Это позволило нехитрым способом сосчитать, сколько раз каждый кейс был задействован в смоуках из выгруженного джейсона. Пример:

count = (" ".join(item.get("attributes").get(attribute_version))).lower().count(platform)

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

print(item["link"] + " " + item["name"] + " {}".format(item["count"]))

Пример получившегося списка:

https://testpalm.ru/testcase/custombike-994 Диплинки facebook 8
https://testpalm.ru/testcase/custombike-1534 Реклама в листинге 8
https://testpalm.ru/testcase/custombike-266 Карточка мото 7
https://testpalm.ru/testcase/custombike-607 Геосаджест 7
https://testpalm.ru/testcase/custombike-1286 Опция турбо 7
https://testpalm.ru/testcase/custombike-1564 Опция продвижение  7
https://testpalm.ru/testcase/custombike-1922 Опция поднятие 7
https://testpalm.ru/testcase/custombike-567 Реклама в карточке мото 6
https://testpalm.ru/testcase/custombike-663 Пожаловаться в карточке мото 6
https://testpalm.ru/testcase/custombike-924 Диплинки на выдачу 5
https://testpalm.ru/testcase/custombike-946 Смена региона 5

Теперь точно понятно! Но чтобы всё было по красоте, осталось обернуть полученные данные в табличку. Для хранения документации мы используем вики, и всё, что нужно было сделать — добавить вики-разметку в выводимый результат. Пример кода:

print("#|")
print("|| Ссылка на пальму  | Название кейса| Количество проходов ||")
for item in cases_list:
   print("|| " + item["link"] + " | " + item["name"] + " | {}".format(item["count"]) + " ||")
print("|#")

Так мы получили красивую легкочитаемую табличку.

Смотреть пример в вики-разметке
|| Ссылка на Testpalm  | Название кейса | Количество проходов ||
|| https://testpalm.ru/testcase/custombike-994 | Диплинки facebook | 8 ||
|| https://testpalm.ru/testcase/custombike-1534  | Реклама в листинге | 8 ||
|| https://testpalm.ru/testcase/custombike-266  | Карточка мото | 7 ||
|| https://testpalm.ru/testcase/custombike-607 |  Геосаджест | 7 ||
|| https://testpalm.ru/testcase/custombike-1286 |  Опция турбо | 7 ||
|| https://testpalm.ru/testcase/custombike-1564  | Опция продвижение  | 7 ||
|| https://testpalm.ru/testcase/custombike-1922  | Опция поднятие | 7 ||
|| https://testpalm.ru/testcase/custombike-567  | Реклама в карточке мото | 6 ||
|| https://testpalm.ru/testcase/custombike-663  | Пожаловаться в карточке мото | 6 ||
|| https://testpalm.ru/testcase/custombike-924  | Диплинки на выдачу | 5 ||
|| https://testpalm.ru/testcase/custombike-946  | Смена региона | 5 ||

В вёрстке таблица будет выглядеть так:
Ссылка на Testpalm Название кейса Количество проходов
https://testpalm.ru/testcase/custombike-994 Диплинки facebook 8
https://testpalm.ru/testcase/custombike-1534 Реклама в листинге 8
https://testpalm.ru/testcase/custombike-266 Карточка мото 7
https://testpalm.ru/testcase/custombike-607 Геосаджест 7
https://testpalm.ru/testcase/custombike-1286 Опция турбо 7
https://testpalm.ru/testcase/custombike-1564 Опция продвижение 7
https://testpalm.ru/testcase/custombike-1922 Опция поднятие 7
https://testpalm.ru/testcase/custombike-567 Реклама в карточке мото 6
https://testpalm.ru/testcase/custombike-663 Пожаловаться в карточке мото 6
https://testpalm.ru/testcase/custombike-924 Диплинки на выдачу 5
https://testpalm.ru/testcase/custombike-946 Смена региона 5
Теперь понятно, с чего начинать автоматизацию, и актуальная статистика всегда будет под рукой. Круто! Но по мере автоматизации мы столкнулись с тем, что в статистику попадают кейсы, которые уже автоматизированы, или те, которые, наоборот, по какой-то причине нет смысла автоматизировать. Решение проблемы было простым — мы добавили ещё два тега:

  • automation — для кейсов, которые уже автоматизированы,
  • without_automation — для кейсов, которые мы не хотим автоматизировать.

Их мы исключили из статистики. Пример кода:

# Проверяем, есть ли автотесты для данного кейса
if attributes_automation in item['attributes']:
   # Проверяем, есть ли автотесты для данной платформы
   if platform in " ".join(item['attributes'][attributes_automation]).lower(): continue


# Проверяем, есть ли ключ "without_automation" для данного кейса
if attributes_without_automation in item['attributes']:
   # Проверяем, есть ли ключ "without_automation" для данной платформы
   if platform in " ".join(item['attributes'][attributes_without_automation]).lower(): continue

Теперь табличка стала чище, и в ней остались только те кейсы, на которые нужно обратить внимание и завести задачи на автоматизацию. Для удобства добавили ещё один столбец — «Задача на автоматизацию». Пример кода:

print("#|")
print("|| Ссылка на пальму  | Название кейса | Количество проходов  | Задача на автоматизацию ||")
for item in cases_list:
   print("|| " + item["link"] + " | " + item["name"] + " | {}".format(item["count"]) + " |" + " ||")
print("|#")

Пример таблички в вёрстке:
Ссылка на Testpalm Название кейса Количество проходов Задача на автоматизацию
https://testpalm.ru/testcase/custombike-266 Карточка мото
https://testpalm.ru/testcase/custombike-607 Геосаджест
https://testpalm.ru/testcase/custombike-1286 Опция турбо
https://testpalm.ru/testcase/custombike-1564 Опция продвижение
https://testpalm.ru/testcase/custombike-1922 Опция поднятие
https://testpalm.ru/testcase/custombike-567 Реклама в листинге
https://testpalm.ru/testcase/custombike-663 Пожаловаться в карточке мото 6
https://testpalm.ru/testcase/custombike-924 Диплинки на выдачу
https://testpalm.ru/testcase/custombike-946 Смена региона
Так как у нас помимо приложения Custom Bike есть и другие проекты, каждый из которых поддерживает iOS и Android, нужно было сделать скрипт формирования статистики более гибким. Мы ещё немного доработали код, и теперь при запуске скрипта можно передавать в него проект и платформу, получая статистику для нужного приложения. Пример запуска скрипта:

python3 get_statistics.py custombike android

Чтобы в табличке был только топ самых используемых кейсов, мы добавили чувствительность, которую также можно передавать в скрипт. Пример запуска скрипта:
Ссылка на Testpalm Название кейса Количество проходов Задача на автоматизацию
https://testpalm.ru/testcase/custombike-266 Карточка мото 7
https://testpalm.ru/testcase/custombike-607 Геосаджест 7
https://testpalm.ru/testcase/custombike-1286 Опция турбо 7
https://testpalm.ru/testcase/custombike-1564 Опция продвижение 7
https://testpalm.ru/testcase/custombike-1922 Опция поднятие 7
https://testpalm.ru/testcase/custombike-567 Реклама в листинге 6
https://testpalm.ru/testcase/custombike-663 Пожаловаться в карточке мото 6
Вот теперь всё стало по красоте!



Заключение


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

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

Надеюсь, статья показалась вам интересной. Если у вас остались вопросы или есть собственные идеи по поводу автоматизации — пишите в комментарии, обсудим.
Источник: https://habr.com/ru/company/yandex_praktikum/blog/585628/


Интересные статьи

Интересные статьи

Доброго времени суток! Сегодня мы будем продолжать изучении ZigBee на примере микроконтроллеров NXP JN5169. В первой статье я рассказывал про периферию микроконтролл...
Переход на юридически значимый документооборот (ЮЗДО) при всем влиянии на эффективность бизнеса остается сложной процедурой: нужно учесть многие нюансы, в том числе закон...
Я расскажу про несколько подходов, которые помогут вам быстро и качественно, а главное бесплатно подготовится к сдаче экзамена и получения сертификата Juniper JNCIA-junos...
Всем доброго времени суток! Эта небольшая статья возможно станет шпаргалкой для начинающих разработчиков, которые хотят проектировать надежные и эффективные схемы управления силовыми полупрово...
Тема статьи навеяна результатами наблюдений за методикой создания шаблонов различными разработчиками, чьи проекты попадали мне на поддержку. Порой разобраться в, казалось бы, такой простой сущности ка...