← Все статьи

Лучшие практики AQA

11 фундаментальных навыков QA Automation Engineer: что нужно знать, чтобы писать нормальные автотесты

Автоматизация тестирования — это не только Selenium, Playwright, pytest или JUnit. В статье разбираю 11 фундаментальных навыков QA Automation Engineer: язык программирования, тестовые фреймворки, API, инфраструктуру, CI/CD, отчётность, архитектуру тестового проекта, декомпозицию, абстракции, метрики, тест-дизайн и AI.

тестированиеqaqa automationqa engineerqa образованиеqa automation engineerавтоматизация тестированиялучшие практикиавтотестыaqa

11 фундаментальных навыков QA Automation Engineer: что нужно знать, чтобы писать нормальные автотесты

Вступление

В этой статье я хочу разобрать 11 фундаментальных навыков, которые полезны почти любому QA Automation Engineer: в UI, API, мобильном, десктопном и интеграционном тестировании.

Речь пойдёт не про конкретный язык программирования, фреймворк или библиотеку. Инструменты меняются: сегодня команда пишет автотесты на Python и pytest, завтра на Java и JUnit, послезавтра на TypeScript, Go или Kotlin. Но базовые навыки автоматизатора остаются примерно одинаковыми.

Особенно актуально это будет для тех, кто сейчас переходит из ручного тестирования в автоматизацию и пытается понять, куда вообще двигаться. Что учить первым? На что не забить? Почему одного Selenium, Playwright или Postman недостаточно?

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

1. Знание языка программирования

Это база. Ещё до того, как разбираться в автотестах, фреймворках, Page Object, API-клиентах и красивых отчётах, нужно нормально выучить язык программирования.

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

QA Automation Engineer — это не ручной тестировщик, который просто нажимает кнопки скриптом. Это инженер, который пишет код для проверки продукта. Да, этот код не всегда похож на продуктовую разработку. Да, чаще всего он живёт в тестовом фреймворке. Но это всё равно кодовая база, которую нужно читать, расширять, чинить, ревьюить и поддерживать годами.

Поэтому язык программирования — первый нормальный фильтр для автоматизатора. Python, Java, TypeScript/JavaScript, Go, C#, Swift, Kotlin — конкретный выбор зависит от направления, команды и проекта. Но принцип один: без уверенного владения языком автоматизация очень быстро превращается в набор хрупких скриптов, которые страшно трогать и невозможно нормально развивать.

2. Знание тестового фреймворка

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

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

Поэтому автоматизатору важно понимать не только синтаксис языка, но и то, как работает его основной тестовый инструмент. Как фреймворк ищет тесты. Как создаёт и уничтожает фикстуры. Как передаёт зависимости. Как запускает setup и teardown. Как обрабатывает падения. Как работает параметризация. Как подключаются плагины и отчёты.

pytest, JUnit, Jest, Behave, Axiom, Kaspresso, XCUITest — конкретный инструмент зависит от языка, платформы и проекта. Но суть одна: без понимания тестового фреймворка вы не сможете нормально управлять автотестами.

3. Понимание системы, контрактов и инфраструктуры

Автотесты проверяют конкретную систему. У этой системы есть API, контракты, базы данных, очереди, кэши, фоновые задачи, внешние интеграции, CLI-инструменты и куча внутренних связей между сервисами.

Если автоматизатор этого не понимает, он очень быстро упирается в потолок. Нельзя нормально тестировать API, если вы не понимаете, что такое HTTP-запрос, статус-код, тело ответа, заголовки и контракт. Нельзя нормально проверять интеграции, если вы не понимаете, где появляется сообщение в Kafka, кто его читает и что должно измениться после обработки. Нельзя уверенно разбирать падение теста, если вы не понимаете, где искать причину: в клиенте, сервисе, базе, очереди, кэше или окружении.

Swagger/OpenAPI, HTTP, gRPC, SQL, Kafka, Redis, PostgreSQL, MongoDB, CLI — это рабочие инструменты, через которые автоматизатор понимает, что именно происходит в системе и как это можно проверить.

Любая бизнес-логика живёт где-то внутри технической реализации. Деньги списываются не «просто так», заказ создаётся не «магически», пользователь авторизуется не потому, что кнопка стала зелёной. За всем этим стоят запросы, события, записи в базе, контракты между сервисами и правила обработки данных.

Поэтому хороший QA Automation Engineer должен уметь смотреть глубже интерфейса. Понять, какой запрос ушёл, какой ответ вернулся, какое событие отправилось, какая запись появилась в базе и какой контракт вообще должен выполняться. Без этого автотесты превращаются в поверхностные проверки, которые что-то кликают, иногда падают и почти ничего не объясняют.

4. Git, CI/CD и DevOps-база

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

Если тесты можно запустить только локально с вашего ноутбука, это не полноценная автоматизация. Команда должна понимать, где лежит код, как его менять, как проходить ревью, как запускать проверки в CI/CD и что делать, если тесты упали после очередного merge request или pull request.

Поэтому git — это база. Без него невозможно нормально работать в команде: вести ветки, фиксировать изменения, разбирать конфликты, откатываться, смотреть историю, проходить code review и встраивать автотесты в общий процесс разработки.

Но одного git тоже недостаточно. Нужно понимать, как работают CI/CD-пайплайны. Когда должны запускаться автотесты. Какие именно тесты нужно гонять на pull request, какие — по расписанию, какие — перед релизом, а какие нет смысла запускать на каждый чих. Сколько раз можно перезапускать упавший тест. Где хранить отчёты. Как отделять быстрые проверки от долгих. Как не превратить пайплайн в медленную красную гирлянду, которую все просто игнорируют.

GitLab CI, GitHub Actions, Jenkins, TeamCity, Bitbucket Pipelines — конкретный инструмент не так важен. Важно понимать сам процесс. Автотесты должны быть частью поставки продукта.

5. Репортинг и наблюдаемость автотестов

Автотесты должны быть видны команде. Если тесты написаны, запускаются в CI/CD, но после падения никто не может быстро понять, что произошло, это всё ещё слабая автоматизация.

Репортинг нужен, чтобы разбирать результат прогона. Какой тест упал. На каком шаге. С какими данными. В каком окружении. Что было в запросе и ответе. Был ли это реальный баг, проблема теста, мигнувшее окружение, недоступный сервис или очередной flaky-тест, который падает раз в неделю и портит всем жизнь.

Большинство тестовых фреймворков уже умеют что-то выводить в stdout. Для маленького проекта этого может хватить. Но когда тестов становятся сотни или тысячи, читать бесконечный лог в CI уже невозможно. Особенно если там вперемешку лежат traceback, print-ы, системные сообщения, логи браузера, ответы API и ещё миллион строк, которые никто не хочет руками раскапывать.

Нормальный отчёт должен помогать быстро отвечать на главный вопрос: почему прогон красный и что с этим делать дальше. Где именно тест упал, на каком действии, с каким контекстом и насколько это похоже на проблему продукта.

Инструменты могут быть разными: Allure, HTML-отчёты, ReportPortal, TestRail, Qase, Kiwi TCMS и другие системы. Конкретный выбор зависит от команды и процесса. Но сам принцип обязателен: если результат автотестов нельзя нормально посмотреть, проанализировать и показать команде, эти автотесты очень быстро превращаются в чёрный ящик.

6. Умение строить тестовый фреймворк

Одних инструментов недостаточно. Можно выучить язык, разобраться с тестовым фреймворком, подключить репортер, настроить запуск в CI/CD, но всё это само по себе не сделает проект удобным для поддержки.

Инструменты не решают за вас, куда складывать страницы, компоненты, элементы, API-клиенты, фикстуры, тестовые данные, утилиты, настройки, конфиги и работу с секретами. Это уже зона ответственности автоматизатора.

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

Хороший фреймворк обычно убирает лишний шум и даёт понятные правила: где живёт логика работы с UI, где лежат API-клиенты, где готовятся данные, где находятся фикстуры, как подключаются настройки и как тесты получают всё необходимое для запуска. Структура фреймворка — это половина успеха. Вторая половина зависит от того, насколько аккуратно вы им будете пользоваться.

7. Умение декомпозировать тесты

Ручной тест-кейс почти всегда написан под ручное тестирование. Ручной тестировщик проходит сценарий глазами, руками, по шагам, с человеческим пониманием контекста. Но автотесты живут по другим правилам.

Плохой автоматизатор берёт ручной кейс и переписывает его в код как есть. Было двадцать шагов в тест-кейсе — стало двадцать шагов в автотесте. Зайти на страницу логина, авторизоваться через UI, открыть раздел, создать сущность, пройти весь бизнес-процесс, проверить финальный текст. Вроде бы всё логично.

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

Хороший автоматизатор сначала разбирает сценарий на части. Что здесь реально нужно проверить через UI. Что можно проверить через API. Какие предусловия нужно вынести в фикстуры. Какие данные подготовить заранее. Где не нужно каждый раз проходить логин руками через браузер. Где можно сразу открыть нужную страницу с подготовленным состоянием. Где один ручной кейс нужно превратить не в один огромный автотест, а в несколько нормальных проверок на разных уровнях.

Иногда из одного ручного сценария должен получиться один E2E-тест, один API-тест и ещё несколько более изолированных проверок. Декомпозиция — один из ключевых навыков автоматизатора. Потому что автотест должен не просто повторять действия человека, а проверять систему наиболее надёжным, быстрым и поддерживаемым способом.

Если переписывать ручные кейсы AS IS, автоматизация очень быстро начинает сама себя хоронить: тесты становятся длинными, хрупкими, медленными и непонятными.

8. Умение работать с абстракциями

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

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

Именно поэтому появляются API Client, Page Object, Page Component, Page Factory, элементы, сервисные классы, билдеры данных и другие абстракции. Они для того, чтобы спрятать технические детали за понятными действиями.

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

При этом абстракции тоже можно испортить. Если завернуть три строки кода в десять классов, станет только хуже, это будет оверинжиниринг. Хорошая абстракция упрощает тест, убирает дублирование и делает поведение понятнее. Плохая — прячет логику так глубоко, что потом никто не может понять, где вообще что происходит.

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

9. Покрытие, стабильность и метрики

Даже если автотесты написаны, запускаются в CI/CD и по ним есть отчёты, этого всё равно недостаточно. В какой-то момент нужно начинать отвечать на неприятные вопросы.

Стабильные у нас тесты или нет? Как часто они падают? Этот тест упал впервые или он флакает уже месяц? Сто автотестов — это много или мало? Что они вообще покрывают? Какие части продукта проверяются?

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

Покрытие тоже важно понимать аккуратно. Само по себе количество автотестов почти ничего не говорит. Можно написать тысячу тестов, которые проверяют одно и то же место, и всё равно не закрыть критичный бизнес-сценарий. А можно написать сто нормальных проверок, которые закроют основные риски продукта гораздо лучше.

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

10. Понимание бизнес-логики, доменной области и теории тестирования

Автотесты нельзя писать просто по принципу «сколько смог, столько и написал»

Автотесты должны проверять реальные риски продукта, а для этого нужно понимать бизнес-логику, доменную область и базовую теорию тестирования.

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

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

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

Хороший автоматизатор должен понимать, где тест нужен, а где нет. Что лучше проверить через UI, что через API, что оставить на уровне интеграционных проверок, а что вообще не автоматизировать, потому что стоимость поддержки будет выше пользы.

11. Умение пользоваться AI

Чаты, агенты, Cursor, Claude Code, Codex и другие помощники могут сильно ускорять работу: набросать черновик кода, подсказать вариант реализации, помочь с рефакторингом, объяснить ошибку, сгенерировать тестовые данные, разобрать лог или предложить структуру.

Но я специально ставлю этот пункт в самый конец.

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

Проблема в том, что без должного понимания вы не сможете отличить нормальное решение от красивого куска нейрослопа. Агент уверенно напишет код, создаст файлы, придумает абстракции, добавит фикстуры, завернёт всё в паттерны и ещё объяснит, почему это «production-ready». По факту может оказаться хрупкая конструкция, которую никто не сможет поддерживать уже через две недели.

Где этому учиться

Чтобы статья не осталась просто списком правильных мыслей, ниже я оставлю материалы по каждому блоку. Где подтянуть язык программирования, где разобраться с фреймворками, где копнуть API, CI/CD, отчёты, архитектуру тестового проекта, метрики, тест-дизайн и AI.

Python:

TypeScript/JavaScript:

Go:

Лучшие практики / процессы:

Заключение

В этой статье мы разобрали 11 навыков QA Automation Engineer, которые были актуальны раньше, актуальны сейчас и будут актуальны дальше.

Конкретные языки, фреймворки и инструменты будут меняться. Сегодня это Python, Java, TypeScript, Playwright, pytest, JUnit, Allure, GitHub Actions, Cursor и другие инструменты. Завтра появится что-то новое. Но база останется той же: язык программирования, тестовый фреймворк, инфраструктура, CI/CD, отчётность, архитектура, декомпозиция, абстракции, метрики, тест-дизайн и понимание продукта.

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

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