# E2E тесты на этапе разработки > Код тестов полезен настолько, насколько он ускоряет процесс разработки. > Чтобы этого достичь, его нужно встраивать в процесс разработки основного продукта так, чтобы он стал его естественной частью, а не побочной деятельностью(с) *How Google Tests Software* >> --- ## Вводная часть. Покрытие фичей E2E-тестами увеличилось за последние 2 года за счёт подключения к автоматизации тестирования Manual-QA, которые прошли внутренний Automation Course. Подробно о задачах QA по автоматизации написано в статье [E2E Tests development process for manual QA](https://wiki.appulate.dev/display/Appulate/E2E+Tests+development+process+for+manual+QA?focusedCommentId=150376332#comment-150376332) ### E2E-тесты пишутся*: 1) До передачи задачи на ручное тестирование; 2) После передачи задачи на ручное на тестирования, но до мержа задачи в общую ветку; 3) После мержа протестированной задачи в общую ветку. Грубо говоря - тесты идут вдогонку; 4) После релиза задачи. Это самый плохой вариант, т.к. задачу по написанию тестов можно отложить на неопределённый срок. **Note:** Речь идёт про написание *новых* тестов по релизной функциональности. Мы сознательно опустим Unit, Интеграционные и API тесты, будем говорить только о E2E-Ui-тестах. **Идеальным вариант - первый:** готовность E2E-тестов должна быть не позднее передачи задачи на ручное тестирование. Сейчас разберём его и обсудим: - Плюсы и минусы такого подхода. - Когда начинать писать код тестов? - Какие могут быть трудности с реализацией? ### ➕Плюсы: - **Ускоряет регресс**: позволит запускать E2E-тесты по новой функциональности на тестовом окружении, т.е там, где будут проходить ручные проверки; - **Экономия времени на ручных проверках**: к передаче функциональности на ручное тестирование успеете провести ни одну итерацию проверок. Например: - при написании автотестов проведёте smoke тестирование, - поработаете и протестируете вёрстку, - посмотрите, как отрабатывает бэкенд, - проведёте исследовательское тестирование и оформите дефекты в задачи(саб-таски); - **Стабильные тесты**: на раннем этапе разработки фронтендер добавит *data-qa* атрибуты на ваши локаторы и тесты будут стабильнее. - **Расширение проверок или рефакторинг**: за время, пока идёт ручное тестирование успеете автоматизировать большее кол-во сценариев/покрыть найденные баги тестами; ### ➖Минусы: - **Частично работающий функционал**: чем раньше подключитесть, тем может быть сложнее: часть функционала отсутствует, баги, соответственно не всё возможно автоматизировать; - **Усложняется работа с Git**: - более частые обновления ветки через ребейзы или создание новой ветки и cherry-pick коммитов в неё, - разрешение конфликтов при обновлении ветки. Чем дольше функциональность будет в разработке, тем больше будет вынужденных обновлений ветки и вероятность конфликтов сильно возрастает. Замечу, что **главный минус** - это менее комфортная работа с веткой, но при должной практике с Git вы его не будете замечать. А частично работающий функционал при написании E2E вам даст время на проведение иследовательского тестирование, что пойдёт вам в плюс. ## Когда начинать писать код E2E Нет правила, когда именно QA должен приступить к написанию кода тестов. Всегда нужно действовать по ситуации. Обычно тригером для старта служит готовность фронтенда, т.е. мы пишем Ui тесты и без готового GUI, хотя бы частично, будет сложно писать код самих тестов и мапить элементы. Поэтому: - **Следите за разработкой**: постоянно коммуницируйте с разработчиками и задавайтесь вопросами: - На каком этапе разработка функциональности? - Можно ли задеплоить код на тестовое окружение, чтобы частично проверить работоспособность фичи? - Будут ли изменения в вёрстке? Это может сыграть ключевую роль в разработке моделей, например для тестирования грида. - Добавлены ли *data-qa* атрибуты и на какие элементы? - **Подготовьте тест-кейсы**: проработайте тестовые сценарии и пройдите их ревью, чтобы как-минимум базовые кейсы были готовы для сквозного тестирования. - **Перейдите к проектированию тестов и PageObject моделей**: проанализируйте, что вам понадобиться замапить на основе макетов (или готовой вёрстки). Полезная информация собрана в статье [Рекомендации по разработке PageObject моделей и E2E-тестов на их основе](https://hackmd.io/@newbloodqaa/rJeTpAn38). ## Пишем код тестов, опережаем трудности Типичный сценарий работы с кодом такой: 1) **Ветвимся от ветки разработки** - как только сайт можно задеплоить и новый функционал на фронте рендерится. Статус задачи *Development in progress*/*Review*. На этом этапе нужно убедиться, что для всех элементов к которым вы будете привязываться - добавлены **data-qa** атрибуты. Это ускорит мапинг элементов. Если аттрибутов нет - всегда простите разработчика добавить их. Сами же временно используйте в локаторах *XPath* или *CSS* 2) **Делаем изменения и осознанно коммитим в удалённую ветку**. Осознанные коммиты - помогут нам не запутаться при [ребейзе](https://hackmd.io/yQWowLhDT2K3ZWE2BO--jA), объединить или изменить порядок коммитов, например если будут коммиты с фиксами или часть изменений добавлена как draft или заккоменчена. Рекомендации по коммитам в статье [Git: Как правильно писать commit-messages](https://hackmd.io/@newbloodqaa/ByYBdHTcL) 3) **Открываем draft-review в GitHub** сразу после первого пуша. Это нужно для того чтобы: - Делать ревью собственного кода в GitHub.Как [Проверить код тестов перед передачей на ревью](https://hackmd.io/@newbloodqaa/HkojryhoL). - Поэтапно добавлять описание к ревью и скриншоты, чтобы не делать это в последний момент. С таким подходом ваши PoolRequiest-ы будут понятными для ревьюверов и для истории. 4) **Своевременно обновляем ветку** и резолвим конфликты при их появлении. Тут всё будет зависеть от ситуации и вашего скила. Помогут с обновлением веток заметки: - [Git: Как сделать rebase на staging (вместо подмерживания staging)](https://hackmd.io/@newbloodqaa/S1k3qZ6Zt) - [Git: Интерактивный ребейз и как удалить коммиты разработчика из своей ветки](https://hackmd.io/@newbloodqaa/HJnuto_4Y) Если с обновлением ветки у вас ступор - соберите новую ветку: - Ветвитесь заново от ветки разработки - Черипикайте коммиты из старой ветки в новую. Порой так бывает даже легче обновиться. 5) **Запускаем стабилизационные прогоны тестов** или full-прогон в Team City. Не забывайте про те категории тестов, которые по умолчанию не запускаются (добавить ссылку на гайд) 6) **Открываем и проходим ревью в GitHub** 7) **Мержим реквест с тестами в ветку разработки** и запускаем full-прогон тестов в Team City ## Что получаем в итоге ➕Работающий код тестов по новому функционалу до перехода задачи на ручное тестирование -это увеличтит ваш перфоманс и ускорит ручное тестирование. ➕Время на расширение покрытия по функционалу. Например, успеете покрыть функциональность негативными сценариями, или найденные баги, если будет необходимость. ➖Неудобства с обновлением ветки. Если задача будет ещё разрабатываться продолжительное время - возможно будут появлятся конфликты с базовой веткой (это часто зависит от функциональности). ###### tags: `Principles of work` `E2E` `draft`