Вопросы на собеседовании: Инженер автоматизации
100 реальных вопросов с образцовыми ответами и пояснениями для уровня QA Automation Engineer.
Смотреть пример резюме: Инженер автоматизации →Тренировка флешкарточками
Интервальное повторение · Hunter Pass
Вопросы
Тест хорошо подходит для автоматизации, когда он повторяемый, ценный и имеет объективный результат.
- Регрессионные и smoke-проверки запускают часто, поэтому автоматизация сокращает объём повторной ручной работы.
- Стабильные входные данные и наблюдаемые результаты позволяют скрипту однозначно определить успех или провал.
- Проверки с большим объемом данных выигрывают от автоматизации, потому что скрипт последовательно обрабатывает много комбинаций.
- Одноразовую проверку меняющегося прототипа обычно дороже автоматизировать, чем выполнить вручную.
Зачем это спрашивают: Интервьюер проверяет, выбираете ли вы задачи для автоматизации по повторяемости, ценности и стабильности, а не пытаетесь автоматизировать все.
Тесты, зависящие от человеческой оценки, постоянно меняющиеся или выполняемые один раз, обычно стоит оставить ручными.
- Исследовательское тестирование опирается на наблюдения и уточняющие вопросы, которые фиксированный скрипт не может предсказать.
- Удобство, визуальная привлекательность и качество текста требуют человеческой оценки, если нет измеримого критерия приемки.
- Быстро меняющийся прототип делает поддержку селекторов и сценариев дорогой.
- Редкие проверки с низким бизнес-риском могут никогда не окупить стоимость реализации и поддержки.
Зачем это спрашивают: Сильный ответ признает ограничения и стоимость поддержки автоматизации, а не считает ручное тестирование устаревшим.
Детерминированный тест дает одинаковый результат, когда код и контролируемые входные данные не меняются.
- Он контролирует время, случайность, тестовые данные и внешние зависимости, а не наследует меняющиеся значения.
- Он ждет измеримого состояния, например видимости элемента, вместо паузы на 5 секунд.
- Он создает или сбрасывает собственные данные, чтобы другой тест не изменил ожидаемый результат.
- При 20 повторах на одной сборке детерминированный тест не должен чередовать успех и провал.
Зачем это спрашивают: Интервьюер оценивает понимание того, что надежная автоматизация требует контролируемых входных данных и наблюдаемой синхронизации.
Пирамида тестирования рекомендует много быстрых unit-тестов, меньше integration-тестов и небольшое число end-to-end тестов.
- Unit-тесты изолируют небольшие части логики и должны давать обратную связь за миллисекунды.
- Integration-тесты проверяют реальные границы, например код приложения вместе с базой данных или HTTP-сервисом.
- End-to-end тесты покрывают критичные пользовательские пути, но дороже в запуске и поддержке.
- Такая форма сохраняет быструю обратную связь и при этом проверяет работу собранного продукта.
Зачем это спрашивают: Интервьюер проверяет, умеете ли вы балансировать скорость, изоляцию, реалистичность и поддержку разных слоев тестов.
До запуска процесса я бы определил ожидаемую сводку, набор файлов и их содержимое на основе небольших контролируемых входных данных.
- Фикстура содержала бы известные записи, чтобы ожидаемые количества, статусы и распределение по выходным файлам вычислялись независимо от реализации.
- Я бы разобрал JSON и проверил его схему и стабильные значения вместо сравнения исходного текста, в котором порядок свойств может меняться.
- Я бы проверил, что выходной каталог содержит ровно два завершённых файла, затем разобрал их и сравнил обязательные строки, поля и порядок только там, где он входит в контракт.
- Сгенерированные временные метки и ID контролировались бы или нормализовались, а временные и неожиданные файлы приводили бы к провалу теста.
Зачем это спрашивают: Интервьюер проверяет, умеете ли вы превратить содержимое, побочные эффекты и стабильные правила сравнения в наблюдаемое решение об успехе или провале автоматизации без UI.
Smoke-тестирование проверяет базовую работоспособность сборки, а регрессионное широко проверяет сохранность существующего поведения.
- Smoke-набор покрывает несколько критичных путей, например запуск, вход и одну основную операцию.
- Он быстро выполняется после деплоя или сборки и останавливает глубокое тестирование, если продукт неработоспособен.
- Регрессионный набор покрывает много ранее работавших функций и обычно выполняется дольше.
- Оба набора можно автоматизировать, но smoke-набор должен оставаться достаточно малым для быстрой обратной связи.
Зачем это спрашивают: Интервьюеру нужно четкое различие по назначению, широте покрытия и времени запуска.
Функциональное тестирование проверяет, что делает система, а нефункциональное проверяет качества ее работы.
- Функциональная проверка подтверждает поведение, например создание заказа с валидными данными.
- Нефункциональные проверки охватывают время ответа, доступность, безопасность и надежность.
- Для обоих нужны измеримые ожидания, например статус 201 при создании или задержка p95 ниже 500 мс.
- Функция может работать правильно, но быть неприемлемой из-за низкой скорости или недоступности.
Зачем это спрашивают: Интервьюер проверяет, отделяете ли вы бизнес-поведение от измеримых характеристик качества.
Полезная проверка подтверждает одно наблюдаемое требование с точным и стабильным ожиданием.
- Проверяйте значимый результат, например статус 201 и ID созданной записи, а не просто отсутствие исключения.
- Сравнивайте стабильные поля и игнорируйте сгенерированные временные метки или случайные ID, если тест их не контролирует.
- Включайте ожидаемое и фактическое значения в сообщение об ошибке, чтобы причина была видна без локального перезапуска.
- Избегайте проверок несвязанного текста страницы, потому что безобидное изменение текста создаст ложный сбой.
Зачем это спрашивают: Интервьюер оценивает, обнаруживают ли ваши проверки реальные дефекты без привязки к нестабильным деталям.
Списки, словари, множества, кортежи и строки покрывают большинство базовых задач с тестовыми данными и результатами.
- Список сохраняет порядок и может содержать последовательность тест-кейсов или полученных записей.
- Словарь сопоставляет имена полей со значениями, что подходит для JSON с полями name и email.
- Множество удаляет дубликаты и быстро проверяет вхождение, а кортеж представляет фиксированную группу значений.
- Выбор типа по его поведению делает проверки понятнее, чем принудительное преобразование всех данных в строки.
Зачем это спрашивают: Интервьюер проверяет практическое владение коллекциями Python для подготовки входных данных и анализа результатов.
Используйте конструкцию with, чтобы Python закрыл файл даже при ошибке.
- Открывайте текстовые файлы с явной кодировкой, например UTF-8, чтобы избежать разного декодирования на разных машинах.
- Осознанно выбирайте режим: r читает, w заменяет содержимое, а a дописывает.
- Читайте большие файлы построчно вместо загрузки всего файла в память.
- Обрабатывайте ожидаемые исключения, например FileNotFoundError, и указывайте затронутый путь.
Зачем это спрашивают: Сильный ответ охватывает освобождение ресурсов, кодировку, режимы и предсказуемую обработку ошибок.
pathlib представляет пути объектами и делает операции с ними понятными и переносимыми.
- Path(base) / results.xml соединяет части с правильным разделителем для операционной системы.
- Методы exists, mkdir, read_text и glob прямо выражают типичные файловые операции.
- resolve может получить абсолютный путь, когда он нужен инструменту.
- Это избавляет от ручного склеивания строк, которое создает двойные или неправильные разделители.
Зачем это спрашивают: Интервьюер проверяет, умеете ли вы писать файловую автоматизацию, одинаково работающую в разных окружениях.
Читайте настройки окружения во время запуска и проверяйте обязательные переменные до старта тестов.
- os.getenv может читать значения вроде BASE_URL, BROWSER или имени тестовой учетной записи.
- Задавайте значения по умолчанию только для безопасных необязательных настроек, например BROWSER со значением chromium.
- Завершайте работу с понятным сообщением при отсутствии обязательного значения, а не передавайте None глубже в код.
- Никогда не печатайте и не коммитьте пароли, токены или API-ключи из окружения.
Зачем это спрашивают: Интервьюер оценивает базовую гигиену конфигурации и понимание того, что секретам не место в исходном коде и логах.
Используйте subprocess.run с явными аргументами и проверяйте результат процесса.
- Передавайте список аргументов, например git, status, вместо одной shell-строки с недоверенными данными.
- Установите check=True, если ненулевой код завершения должен вызвать CalledProcessError.
- Используйте capture_output=True и text=True, когда скрипту нужны читаемые stdout и stderr.
- Добавьте таймаут, чтобы зависший внешний инструмент не блокировал автоматизацию бесконечно.
Зачем это спрашивают: Сильный ответ показывает безопасную передачу аргументов и явную обработку кода завершения, вывода и таймаута.
Код завершения сообщает об успехе команды: по соглашению 0 означает успех, а ненулевое значение означает ошибку.
- Shell, CI-раннер или родительский процесс использует код, чтобы решить, запускать ли следующий шаг.
- Разные ненулевые значения могут различать неверные входные данные, падение теста и отсутствие зависимости.
- Перед возвратом кода ошибки скрипт должен вывести полезное сообщение в stderr.
- Если скрыть ошибку и завершиться с кодом 0, сломанная тестовая задача может выглядеть успешной.
Зачем это спрашивают: Интервьюер проверяет, понимаете ли вы контракт между скриптами автоматизации и CI-системами.
Перехватывайте только те исключения, которые можете обработать или дополнить контекстом, а неожиданные сбои оставляйте видимыми.
- При разборе файла результатов ловите конкретный тип, например JSONDecodeError, а не общий Exception.
- Добавляйте контекст, например путь к файлу или имя команды, и сохраняйте исходную причину при повторном выбрасывании.
- Используйте finally для очистки, обязательной и при успехе, и при ошибке.
- Никогда не оставляйте пустой блок except, потому что он превращает реальный сбой в вводящий в заблуждение результат теста.
Зачем это спрашивают: Интервьюер оценивает, сохраняет ли обработка ошибок диагностическую информацию вместо сокрытия дефектов.
Надежные Bash-скрипты заключают переменные в кавычки, проверяют ошибки команд и явно задают поведение конвейеров.
- Используйте двойные кавычки вокруг подстановок вроде $file, чтобы пробелы не разделили один путь на несколько аргументов.
- Конвейер передает stdout одной команды в stdin следующей, например от команды-источника к grep.
- set -e завершает shell при многих необработанных ненулевых статусах, но имеет контекстные исключения для условий, списков команд и частей конвейера, поэтому ожидаемые ошибки нужно обрабатывать явно, а set -o pipefail использовать для выявления ошибок внутри конвейера.
- Отправляйте диагностику в stderr и возвращайте ненулевой код, если скрипт не может завершить работу.
Зачем это спрашивают: Сильный ответ выделяет кавычки и распространение ошибок как основные меры защиты в shell-автоматизации.
Создайте отдельную ветку, делайте небольшие коммиты и отправьте изменение на ревью до слияния.
- Начните от обновленной ветки main, чтобы изменение теста основывалось на актуальном коде.
- Используйте git status и git diff, чтобы проверить, какие именно файлы и строки попадут в коммит.
- Напишите короткое сообщение коммита о добавленном или исправленном поведении.
- Отправьте ветку и откройте pull request, чтобы до изменения main прошли тесты и ревью.
Зачем это спрашивают: Интервьюер проверяет, умеете ли вы вносить тестовый код через дисциплинированный командный процесс.
Конфликт слияния возникает, когда Git не может безопасно объединить конкурирующие изменения и требуется решение человека.
- Git отмечает в файле конфликтующие фрагменты текущей и входящей веток.
- Прочитайте обе версии, оставьте нужное итоговое содержимое и удалите все маркеры конфликта.
- После редактирования запустите связанные тесты, потому что синтаксически разрешенный файл все еще может быть логически неверным.
- Добавьте исправленный файл в индекс и завершите merge или rebase согласно процессу команды.
Зачем это спрашивают: Интервьюер оценивает, считаете ли вы разрешение конфликта решением по коду с последующей проверкой.
pytest находит тесты по соглашениям об именовании, а затем собирает подходящие функции и классы.
- По умолчанию он ищет файлы с именами test_*.py или *_test.py.
- Он собирает функции test_* и методы test_* внутри классов Test*.
- В тестовых классах не следует определять __init__, потому что pytest сам создает их экземпляры.
- pytest --collect-only показывает, что будет запущено, не выполняя тесты.
Зачем это спрашивают: Интервьюер проверяет, понимаете ли вы, почему корректно выглядящий pytest-тест может попасть или не попасть в сборку.
Fixture в pytest предоставляет тестам переиспользуемые данные или ресурсы через аргументы функций.
- Пометьте функцию-поставщик через pytest.fixture и запросите ее, указав имя параметром теста.
- Fixture может вернуть тестовые данные, настроенный API-клиент или страницу браузера.
- Код после yield выполняет teardown, например закрывает соединение после теста.
- Fixtures сокращают дублирование настройки и сохраняют зависимости видимыми в сигнатуре каждого теста.
Зачем это спрашивают: Сильный ответ объясняет внедрение зависимостей, повторное использование и teardown, а не называет fixtures обычными функциями настройки.
Закрытые вопросы
- 21
Что контролируют области видимости fixtures в pytest?
pytestfixtures - 22
Что делает pytest.mark.parametrize?
pytestparametrize - 23
Для чего используются markers в pytest?
pytest - 24
Как работают обычные assertions в pytest?
pytest - 25
Как проверить ожидаемое исключение с помощью pytest?
pytesterror-handling - 26
Что такое mocking в unit-тесте pytest?
unitmockingpytest - 27
Как monkeypatch и tmp_path помогают в тестах pytest?
pytest - 28
Что делает Selenium WebDriver?
selenium - 29
Что такое DOM и почему браузерная автоматизация использует его?
dom - 30
Что делает браузерный локатор надежным?
locators - 31
Когда использовать CSS-селектор, а когда XPath?
csslocators - 32
Что такое explicit wait в Selenium?
selenium - 33
Почему explicit waits обычно лучше фиксированных пауз и широких implicit waits?
- 34
Какие состояния элемента должен различать браузерный тест?
- 35
Как организовать настройку и очистку браузера в тестах?
testing - 36
Как auto-waiting в Playwright помогает браузерным тестам?
playwright - 37
Что такое browser context в Playwright?
playwright - 38
Какие стратегии локаторов Playwright стоит предпочитать junior-инженеру автоматизации?
playwrightlocators - 39
Что такое Page Object Model?
pom - 40
Когда и как браузерным тестам сохранять скриншоты?
testing - 41
Что такое REST API с точки зрения автоматизации тестирования?
restautomation - 42
Что означают основные HTTP-методы в API-тестах?
httptesting - 43
Какие HTTP-коды статуса должен знать junior API-тестировщик?
httpstatus-codes - 44
Что должна проверять валидация JSON Schema в API-тесте?
schemaapivalidation - 45
Как токен-аутентификация представлена в базовом API-тесте?
authtokensapi - 46
Что должна включать базовая автоматизированная проверка ответа API?
api - 47
Как использовать SQL для проверки результата автоматизированного теста?
sql - 48
В чем разница между Docker image и container?
dockercontainers - 49
Зачем запускать автоматизированные тесты в Docker?
docker - 50
Что такое continuous integration и какое место в нем занимают автоматизированные тесты?
ci-cd - 51
Тест входа ожидает ошибку после трёх неверных паролей, но учётная запись блокируется, и следующие тесты падают. Как это исправить?
passwordstesting - 52
Как автоматизировать форму регистрации, где кнопка Submit становится доступна только после корректного заполнения всех полей?
forms - 53
Браузерный тест нажимает Export и должен получить CSV-файл. Что вы будете проверять?
- 54
Как протестировать загрузку изображения профиля, которая принимает PNG размером до 2 МБ?
- 55
После нажатия Terms открывается новая вкладка, но тест продолжает искать элементы в исходной. Как это обработать?
- 56
Кнопка Delete открывает системный диалог подтверждения браузера. Как автоматизировать Cancel и Confirm?
- 57
Поле банковской карты находится внутри iframe, и обычный локатор его не видит. Что вы сделаете?
locators - 58
Как переиспользовать авторизованную браузерную сессию, не выполняя вход через UI перед каждым тестом?
sessionslogging - 59
Локатор Save находит три кнопки, и тест нажимает не ту. Как его исправить?
locators - 60
Таблица результатов появляется через 1-8 секунд после Search, а sleep на две секунды работает нестабильно. Какое ожидание использовать?
flaky - 61
Тест находит строку, обновляет таблицу, а затем получает stale element error при клике по этой строке. Почему и как это исправить?
- 62
Два браузерных теста проходят отдельно, но падают вместе, потому что один оставляет consent cookie и открытое модальное окно. Как их изолировать?
cookiestesting - 63
Как автоматизировать REST CRUD-сценарий для нового клиента?
rest - 64
Эндпоинт возвращает большой JSON-объект заказа. Как проверить ответ, не сравнивая каждое значение?
validationendpoints - 65
Какие автоматизированные API-сценарии вы напишете для эндпоинта, защищённого Bearer-токеном?
endpointstokens - 66
Как протестировать пагинированный эндпоинт, который возвращает по 25 элементов на страницу?
endpoints - 67
API создаёт счета из JSON. Какие негативные варианты payload вы автоматизируете первыми?
api - 68
Как протестировать обновление и удаление для ID ресурса, которого не существует?
- 69
Эндпоинт пользователей поддерживает фильтры status и created_after. Как их протестировать?
endpoints - 70
Клиент отправил Create payment, не дождался ответа и повторил запрос. Какое идемпотентное поведение должен проверить тест?
idempotency - 71
Как проверить, что API отклоняет неподдерживаемый HTTP-метод?
http - 72
API иногда возвращает 429 Too Many Requests. Как junior-инженеру обрабатывать это в автоматизированных тестах?
api - 73
Несколько тестов создают пользователей с одинаковым email и конфликтуют. Как генерировать безопасные тестовые данные?
test-data - 74
Перед тестом нужен заказ с двумя позициями. Как подготовить его через SQL?
sql - 75
Как гарантировать очистку тестовых данных, если одна из проверок падает в середине теста?
test-data - 76
Когда rollback транзакции полезен в тестах с базой данных?
databasetransactionstesting - 77
Четыре CI worker параллельно запускают одинаковые тесты. Как изолировать их данные в базе?
databasetesting - 78
UI-тест сообщает, что заказ отменён. Какой SQL-запрос использовать для проверки сохранённого состояния?
sql - 79
Тест проходит локально, но падает в GitHub Actions, потому что не найден файл фикстуры. Что вы проверите?
fixturesci-cd - 80
Тестовая команда сообщает об ошибках, но CI job остаётся зелёной. В чём вероятная причина?
- 81
Какие артефакты собирать при падении браузерного теста в CI?
debuggingartifacts - 82
Как передать base URL и тестовый пароль в CI job?
passwords - 83
Браузерные тесты работают в видимом браузере, но падают в headless CI. Как отлаживать различие?
testing - 84
Нестабильному тесту настроили пять повторов, и обычно он проходит с четвёртой попытки. Это приемлемо?
flakyconfig - 85
Как разделить 20-минутный набор тестов в CI, чтобы pull request быстро получал полезный результат?
feedbackcode-review - 86
Тесты начали падать только после увеличения параллельности CI с одного до четырёх worker. Что проверить первым?
testing - 87
После обновления пакета CI job внезапно падает на установке зависимостей. Как расследовать проблему?
dependencies - 88
CI job достигает 30-минутного timeout без понятной ошибки. Что добавить для диагностики?
resilience - 89
Какая минимальная настройка нужна для запуска простого Appium-теста на Android-эмуляторе?
mobile - 90
Какой локатор лучше выбрать для мобильной кнопки Login в Appium?
mobilelocators - 91
Appium-тест видит нативную оболочку приложения, но не находит поля внутри встроенной веб-страницы. Что делать?
mobile - 92
Мобильный тест проходит на чистом эмуляторе, но падает при втором запуске, потому что onboarding уже пропущен. Как управлять состоянием устройства?
onboarding - 93
Как автоматизировать мобильный тест, которому нужно разрешение камеры?
- 94
Экранная клавиатура закрывает мобильный элемент, поэтому нажатие Save падает. Как сделать тест стабильным?
- 95
Python-автоматизация перемещает входящие счета из одной папки в другую. Как безопасно обрабатывать файлы?
concurrencypython - 96
Как запускать скрипт отчёта каждый час и не допускать пересечения двух медленных запусков?
- 97
После перезапуска автоматизация процесса дважды импортирует один ежедневный CSV. Как предотвратить дубликаты?
concurrency - 98
Скрипт мониторинга обнаружил три подряд ошибки эндпоинта. Как безопасно отправить webhook-оповещение?
monitoringalertingendpoints - 99
Какие exit codes и логи должна предоставлять консольная автоматизация?
- 100
Новый RPA-скрипт вводит заказы в портал поставщика, но портал часто меняется. Какой ручной fallback подготовить?
procurement