Вопросы для собеседования QA-автоматизатора
Готовый набор для интервьюера: 36 вопросов с тезисами эталонного ответа, задача, рубрика и план встречи.
На собеседовании QA-автоматизатора хорошо работает схема на 60 минут: 3-4 устных вопроса по стеку, одна задача на live coding, проектирование для middle и выше и вопросы кандидата. Ниже вопросы по грейдам из базы Техпрогона: у каждого тезисы, которые должен назвать сильный кандидат.
Всего в базе по этой роли 287 устных вопросов с чек-листом ответа.
Как построить техсобес на 60 минут
0-5 мин
Знакомство
Кто вы, формат встречи, кандидат коротко о себе и последнем проекте.
5-20 мин
Вопросы по стеку
3-4 устных вопроса из набора ниже. Сверяйте ответ с тезисами.
20-45 мин
Live coding
Одна задача. Смотрите на процесс по рубрике, а не только на ответ.
45-55 мин
Проектирование
Для middle и выше: система или решение целиком. Для junior: ещё вопросы.
55-60 мин
Вопросы кандидата
Что спросил кандидат, тоже сигнал: интерес к задачам и команде.
Junior: 12 вопросов
Основы: как устроено и зачем. Хватит 3-4 вопросов на встречу.
Что такое тестирование и зачем оно нужно компании?
Что хотим услышать
- Проверка продукта на соответствие требованиям и ожиданиям пользователей
- Цель шире поиска багов: информация о качестве для решения о релизе
- Снижение рисков: денег, репутации, юридических
- Предотвращение дефектов: ревью требований, ранние проверки
- Различие QA, QC и тестирования
Если ответил, копните глубже
Расскажи, чем GET отличается от POST и что из этого важно для тестирования.
Что хотим услышать
- GET читает данные, POST отправляет данные на обработку, обычно создаёт ресурс
- GET безопасный и идемпотентный, POST ни то, ни другое
- Параметры GET идут в URL (видны в логах и истории), данные POST в теле
- GET-ответы можно кешировать, POST обычно нет
- Проверки: повторный POST создаёт дубль, GET не меняет данные, чувствительное не уходит в URL
Если ответил, копните глубже
Расскажите, что такое пирамида тестирования и как она выглядит в вашем последнем проекте.
Что хотим услышать
- Уровни: unit, интеграционные и API, E2E
- Почему внизу больше: скорость, стоимость, точность локализации
- Антипаттерн рожка мороженого
- Пирамида не догма: трофей, контрактные тесты
- Конкретные цифры своего проекта и почему так
Если ответил, копните глубже
Напишите вслух декоратор, который логирует время выполнения функции, и объясните каждую строку.
Что хотим услышать
- Внешняя функция принимает
func, возвращает обёртку - Обёртка принимает
*args, **kwargsи передаёт их дальше - Возвращает результат
func functools.wrapsсохраняет имя и docstring- Время через
time.perf_counter, вывод вfinallyили после вызова - Код декоратора выполняется при определении, обёртки при каждом вызове
Если ответил, копните глубже
Чем отличаются var, let и const? Что из них вы используете и почему?
Что хотим услышать
varс функциональной областью,letиconstс блочнойvarподнимается сundefined,let/constпопадают в TDZvarможно объявить повторно,let/constнетconstзапрещает переприсваивание, но не изменение объектаvarна верхнем уровне скрипта становится свойствомwindow- По умолчанию
const,letдля изменяемых,varне использую
Если ответил, копните глубже
let в цикле for ведёт себя иначе, чем var?let?Чем отличается WHERE от HAVING? Приведи пример, где нужны оба.
Что хотим услышать
- WHERE фильтрует строки до группировки, HAVING фильтрует группы после
- В WHERE нельзя агрегаты, в HAVING можно
- Порядок: FROM, WHERE, GROUP BY, HAVING, SELECT
- Условия без агрегатов лучше писать в WHERE: меньше строк до группировки
- Пример: WHERE status = 'paid' и HAVING SUM(total) > 10000
Если ответил, копните глубже
Объясни, зачем фронтенд-проекту сборщик и что происходит с кодом от исходников до файлов в dist.
Что хотим услышать
- граф зависимостей от точки входа
- трансформация: TS, JSX, современный синтаксис, CSS
- резолв пакетов из node_modules
- склейка в чанки, минификация, tree shaking
- хеши в именах для долгого кеша
- dev-сервер с HMR и source maps
Если ответил, копните глубже
Объясни разницу между жёсткой и символьной ссылкой. Когда какую использовать?
Что хотим услышать
- Жёсткая ссылка: ещё одно имя того же inode, равноправное с оригиналом
- Данные живут, пока счётчик ссылок больше нуля и файл никто не держит открытым
- Жёсткую нельзя на каталог и между разными ФС
- Символьная: отдельный файл, внутри которого путь к цели
- Символьная ломается при удалении или переносе цели, зато работает с каталогами и через ФС
- Пример: symlink на текущий релиз
current -> releases/42для атомарного переключения
Если ответил, копните глубже
ls -l во второй колонке?Назовите ваши сильные стороны.
Что хотим услышать
- Две-три стороны, а не список из десяти
- Каждая подкреплена примером
- Стороны связаны с вакансией
- Нет пустых слов вроде «стрессоустойчивый, коммуникабельный» без доказательств
- Уверенно, без хвастовства
Если ответил, копните глубже
Что делает баг-репорт хорошим?
Что хотим услышать
- Понятный заголовок: где и что, без эмоций
- Окружение и версия сборки
- Точные шаги с данными, которые воспроизведёт любой
- Фактический и ожидаемый результат, ожидаемое со ссылкой на источник
- Доказательства: скриншот, видео, логи, ответы сервера
- Один дефект на репорт, корректная серьёзность, нет лишнего
Если ответил, копните глубже
Что такое REST API? Объясни так, как объяснил бы на собеседовании на тестировщика.
Что хотим услышать
- Архитектурный стиль поверх HTTP, где всё ресурс с адресом
- Действие задаёт HTTP-метод: GET читает, POST создаёт, PUT/PATCH меняют, DELETE удаляет
- Сервер не хранит состояние клиента между запросами
- Результат передаётся кодом ответа и телом, обычно JSON
- Договор описывают в OpenAPI, по нему и тестируют
Если ответил, копните глубже
Расскажите, какие бывают ожидания в UI-автотестах и какие вы используете.
Что хотим услышать
- Почему нужны: асинхронная загрузка, тест быстрее страницы
- sleep плох: ждёт время, а не состояние
- Неявное: глобально на поиск элемента
- Явное: конкретное условие с таймаутом и интервалом опроса
- Playwright: автоожидание и web-first assertions
Если ответил, копните глубже
Middle: 12 вопросов
Практика: почему так, какие компромиссы, что ломается.
Какими возможностями DevTools ты пользуешься в работе и зачем?
Что хотим услышать
- Network: запросы, коды, тела, Preserve log, Disable cache, throttling, Copy as cURL
- Console: ошибки JavaScript, предупреждения, CORS
- Application: куки и их флаги, localStorage, очистка данных сайта
- Elements: вёрстка, стили, временная правка для проверки
- Эмуляция устройств и Lighthouse для адаптивности, скорости и доступности
Если ответил, копните глубже
Как ты тестируешь аутентификацию и авторизацию в API?
Что хотим услышать
- Аутентификация: без токена, с битым, просроченным, чужого окружения, с изменённой подписью: 401
- Авторизация по ролям: матрица роль на эндпоинт, привилегированные методы токеном низшей роли: 403
- Чужие объекты по id (IDOR/BOLA) во всех методах, включая PUT и DELETE
- Mass assignment и лишние поля в ответах
- Жизненный цикл: выход отзывает токены, смена пароля, ротация refresh, брутфорс ограничен
Если ответил, копните глубже
Расскажите, как устроен фреймворк API-автотестов, который вы писали или поддерживали.
Что хотим услышать
- Стек: язык, HTTP-клиент, раннер, валидация схем
- Слои: клиенты, модели, фикстуры и фабрики данных, тесты
- Проверки: статус, тело, схема, побочные эффекты, негативные
- Данные: создаются тестом, уникальны, удаляются в teardown
- Логирование запросов и ответов в отчёт, конфиг окружений
Если ответил, копните глубже
Чем asyncio отличается от многопоточности? Когда вы выберете одно, а когда другое?
Что хотим услышать
- asyncio: один поток, кооперативная многозадачность, переключение на await
- Потоки: вытесняющая многозадачность ОС, переключение где угодно
- Корутины дешёвые, тысячи соединений; поток дороже по памяти
- asyncio требует асинхронных библиотек, блокирующий вызов стопорит всё
- Потоки для синхронных библиотек и небольшого числа задач
- Ни то, ни другое не ускоряет CPU-bound код
Если ответил, копните глубже
Объясни event loop: как браузер решает, что выполнять следующим.
Что хотим услышать
- JS однопоточный, есть стек вызовов
- макрозадачи: таймеры, события, сеть - по одной за цикл
- микрозадачи: промисы, queueMicrotask, MutationObserver
- после каждой макрозадачи очередь микрозадач вычерпывается полностью
- рендер происходит между макрозадачами, requestAnimationFrame - перед отрисовкой
- бесконечная генерация микрозадач заблокирует рендер
Если ответил, копните глубже
Спроектируй схему базы для заказов интернет-магазина: клиенты, товары, заказы, оплаты. Какие таблицы, ключи и ограничения?
Что хотим услышать
- Таблицы customers, products, orders, order_items, payments и их связи
- order_items как связь заказа и товара с qty и ценой на момент покупки
- Ограничения: FK, NOT NULL, CHECK (qty > 0), UNIQUE там, где нужно
- Типы: numeric или копейки для денег, timestamptz для времени, статус через CHECK или enum
- Индексы на FK и под частые запросы (заказы клиента по дате)
- Платежи отдельной таблицей с идемпотентным внешним id от платёжки
Если ответил, копните глубже
Как бы ты построил CI/CD для веб-приложения с нуля?
Что хотим услышать
- На каждый PR: npm ci, линтер, типы, unit-тесты, сборка
- Быстрые проверки первыми, независимые джобы параллельно, кеш зависимостей
- Защита ветки main: мерж только с зелёным CI и ревью
- Сборка один раз, артефакт (образ) с версией продвигается по стендам
- Деплой на стенд автоматически, на прод с подтверждением или автоматически при хорошем покрытии
- План отката и миграции, совместимые с предыдущей версией
Если ответил, копните глубже
Мониторинг сообщает: корневой раздел заполнен на 100%, сервис падает. Что делаешь по шагам?
Что хотим услышать
- Оценить:
df -hиdf -i, место или inode - Найти крупное:
du -xh / --max-depth=1 | sort -h, затем вглубь; обычно логи, кеши, дампы, docker - Проверить удалённые, но открытые файлы:
lsof +L1 - Быстро освободить безопасно: обнулить лог через
: > fileилиtruncate, а неrmоткрытого файла;journalctl --vacuum-size,docker system pruneс пониманием - Устранить причину: logrotate, лимиты журнала, алерт на 80%
- Если нужно место надолго: расширить диск или том LVM онлайн
Если ответил, копните глубже
rm лога может не помочь?Почему вы ищете новую работу?
Что хотим услышать
- Причина через цель, а не через бегство
- Ни слова негатива о текущем работодателе
- Показано, что на текущем месте был рост и результаты
- Связка с этой вакансией
- Коротко: до минуты
Если ответил, копните глубже
Что ты делаешь между «увидел баг» и «завёл баг-репорт»?
Что хотим услышать
- Повторить, чтобы убедиться, что воспроизводится, и найти минимальные шаги
- Проверить, не дубликат ли и не известная ли это проблема
- Сузить условия: другой браузер, другая учётка, другие данные
- Посмотреть Network и Console: фронт или бэк
- Проверить, есть ли в проде или появилось в этой сборке
- Собрать доказательства и оценить серьёзность
Если ответил, копните глубже
Как ты используешь SQL и базу данных в работе тестировщика? Приведи примеры запросов.
Что хотим услышать
- Проверка результата: запись после API-запроса, поля, статусы, связанные таблицы
- Поиск дефектов в данных: дубли через GROUP BY HAVING, сироты через LEFT JOIN или NOT EXISTS, расхождения сумм
- Подготовка данных: нужные состояния, которые долго создавать через интерфейс
- Разбор бага: на каком шаге данные стали неверными
- Осторожность: NULL-ловушки, доступ только на чтение к важным стендам, без правок в проде
Если ответил, копните глубже
Расскажите, как автотесты были встроены в CI в вашем последнем проекте.
Что хотим услышать
- Инструмент CI и события: PR, мерж, ночь, после деплоя
- Какие наборы где и сколько идут
- Параллельность: воркеры, шарды
- Секреты, окружения, данные
- Отчёты и артефакты, уведомления, кто разбирает падения
Если ответил, копните глубже
Senior: 12 вопросов
Глубина и опыт: границы подходов, решения в продакшене.
Разработчик раз за разом отклоняет твои баги как «не баг» или «не воспроизводится». Как выстроишь работу?
Что хотим услышать
- Разобрать конкретные случаи: в чём причина отклонений
- Улучшить баг-репорты: окружение, данные, видео, логи, ожидаемое со ссылкой на источник
- Договориться о критериях: что считается дефектом, кто решает спорные случаи
- Спорные случаи к владельцу продукта, а не в переписку
- Показывать вживую и разбирать вместе, без обвинений
Если ответил, копните глубже
Чем тестирование GraphQL отличается от REST и что ты проверишь?
Что хотим услышать
- Один эндпоинт, ответ зависит от выбранных полей; проверять data и errors, а не только код
- Частичные ответы: ошибка в одном поле не ломает остальные
- Авторизация на уровне полей и резолверов, а не только эндпоинта
- Безопасность и нагрузка: глубина и сложность запросов, батчинг, интроспекция в проде
- Производительность: N+1 в резолверах, пагинация списков
Если ответил, копните глубже
У вас 20 микросервисов, интеграционный стенд постоянно сломан, а релизы ломают соседей. Как построите тестирование взаимодействий?
Что хотим услышать
- Проблема: общий стенд медленный и нестабильный, поломки видны поздно
- Контрактные тесты consumer-driven (Pact) или проверка по OpenAPI
- Контракт в CI потребителя и поставщика, брокер и can-i-deploy
- Компонентные тесты сервиса с моками соседей (WireMock, testcontainers)
- Небольшой набор E2E на ключевые сквозные сценарии
- Версионирование API и правила обратной совместимости
Если ответил, копните глубже
Ваш Python-сервис стал отвечать медленно. Как вы будете искать причину и что можете сделать?
Что хотим услышать
- Метрики и трейсы: какой эндпоинт, p95/p99, где время (БД, внешние API, CPU)
- Профилирование: py-spy на живом процессе, cProfile локально
- Типичные причины: N+1 запросы, отсутствие индексов, синхронные вызовы в async, неверные структуры данных
- Исправления: батчи и prefetch, кеш, индексы, перенос тяжёлого в фон
- CPU-bound: алгоритм, встроенные функции, numpy, процессы
- Проверка результата нагрузочным тестом
Если ответил, копните глубже
Как бы вы реализовали перебор всех записей постраничного API так, чтобы вызывающий код просто писал for await (const item of allItems())?
Что хотим услышать
async function*, внутри цикл по страницам сawait fetchyield*по элементам страницы илиyieldпоштучно- Условие остановки: нет курсора
nextили пустая страница - Ленивость: следующая страница грузится только когда потребитель дошёл до конца текущей
- Досрочный
breakу потребителя завершает генератор, запросы прекращаются;finallyдля очистки - Ошибки и отмена:
try/catchу потребителя,AbortSignalв параметрах
Если ответил, копните глубже
Расскажите, как в PostgreSQL устроен MVCC, откуда берутся мёртвые строки и зачем нужен VACUUM.
Что хотим услышать
UPDATEсоздаёт новую версию строки, старая остаётся сxmax;DELETEтолько помечает версию- Каждая транзакция видит версии по своему снимку, поэтому чтение не блокирует запись и наоборот
- VACUUM удаляет версии, которые уже никому не видны, обновляет visibility map и замораживает старые строки
- Долгие транзакции и забытые слоты репликации мешают очистке и раздувают таблицы
- Autovacuum настраивают по таблицам:
autovacuum_vacuum_scale_factor, лимиты стоимости; мониторинг черезpg_stat_user_tables - HOT-обновления и
fillfactorуменьшают нагрузку на индексы
Если ответил, копните глубже
VACUUM FULL отличается от обычного?Ты приходишь в проект без тестов. Как выстроишь стратегию тестирования?
Что хотим услышать
- начать с самого рискованного и ценного для бизнеса: оплата, вход, ключевые сценарии
- несколько e2e smoke-тестов на критичные пути
- unit-тесты на чистую логику: расчёты, форматирование, утилиты
- интеграционные тесты компонентов и API на новых и изменяемых местах
- тесты в CI как обязательная проверка PR
- регрессионный тест на каждый найденный баг, борьба с флаки
Если ответил, копните глубже
Пользователи жалуются, что https://api.example.com не открывается. Как будешь искать причину?
Что хотим услышать
- Воспроизвести и уточнить симптом: таймаут, refused, ошибка TLS, 5xx
- DNS:
dig +short, правильный ли IP, не истёк ли домен - Сеть и порт снаружи:
curl -v,nc -zv host 443; refused или timeout - На сервере: слушает ли процесс и на каком адресе (
ss -tlnp), отвечает ли локально - Фаервол на хосте и в облаке, балансировщик и его health checks
- Логи прокси и приложения, сертификат и его срок
Если ответил, копните глубже
Вы претендуете на senior. Расскажите о себе.
Что хотим услышать
- Назван масштаб: команда, нагрузка, пользователи или деньги
- Есть решения, которые повлияли дальше своего кода
- Есть метрики результата
- Упомянуто влияние на команду: менторинг, процессы, ревью
- Уложился в 2 минуты, не утонул в деталях
Если ответил, копните глубже
Как выстроить регрессионное тестирование в продукте с релизами раз в две недели?
Что хотим услышать
- Анализ влияния изменений для выбора объёма
- Приоритизация тест-кейсов по рискам и критичности сценариев
- Автоматизация стабильной части регрессии и запуск в CI
- Ручная регрессия на рискованных и новых местах
- Регулярная чистка набора: удалять устаревшее, добавлять тесты по утёкшим багам
- Метрики: время регрессии, утечка дефектов, флаки
Если ответил, копните глубже
Как ты протестируешь эндпоинт списка с пагинацией, фильтрами и сортировкой?
Что хотим услышать
- Границы: limit 0, 1, максимум и больше максимума, отрицательные и нечисловые значения
- Полнота: сумма элементов всех страниц равна total, нет дублей и пропусков
- Стабильность: вставка или удаление записи между страницами, стабильная сортировка при равных ключах
- Фильтры: каждый отдельно, комбинации, пустой результат, неизвестные значения
- Безопасность и производительность: инъекция в sort, огромный limit, чужие данные в выдаче
Если ответил, копните глубже
Автотесты на пул-реквест идут час, разработчики жалуются. Как сократите до 15 минут?
Что хотим услышать
- Измерить: где время, самые долгие тесты и шаги, ожидание агентов
- Разделить наборы: на PR смоук и затронутое, полный после мержа
- Параллелить: воркеры и шардинг по длительностям, изоляция данных
- Опустить проверки ниже: API вместо UI, данные через API
- Инфраструктура: кеш зависимостей, готовые образы, свой пул агентов
- Удалить дубли и мёртвые тесты, следить за трендом
Если ответил, копните глубже
Задача для live coding
Двойное списание
Найди заказы, по которым прошло больше одного успешного платежа.
Колонки: order_id, cnt. Порядок строк не важен.
- Подсказка, если застрял: Отфильтруй
status = 'success'до группировки. - Подсказка, если застрял: Условие на число строк в
HAVING.
Эталон, тесты и таймер открываются интервьюеру в живом моке
Рубрика оценки: 1-4 балла
Те же критерии процесса, что в живом моке Техпрогона. Ставьте балл по каждому пункту, сумма показывает картину лучше, чем «понравился или нет».
Уточнил условие
Ограничения, формат входа, что вернуть при пустом вводе
Привёл примеры до кода
Обычный случай и хотя бы один краевой
Проговорил алгоритм словами
До того как писать код
Назвал сложность
По времени и по памяти
Написал рабочий код
Тесты прошли
Сам проверил краевые случаи
Прогнал в голове пустой ввод, один элемент, дубликаты
Нашёл и исправил ошибку сам
Или ошибок не было с первого раза
Мок-собес без регистрации для интервьюера
Хотите проверить кандидата на задаче с эталоном и рубрикой? Так работает живой мок в Техпрогоне.
Кандидат готовится в Техпрогоне и на задаче открывает ступень «Живой мок».
Он присылает вам ссылку. Вы открываете её без регистрации.
У вас условие, эталон, рубрика, уточняющие вопросы и таймер.
Вы ставите оценки и вердикт, кандидат сразу видит результат.
Для интервьюера бесплатно. Ссылку создаёт кандидат на тарифе Рывок
Наборы для других ролей
Готовитесь к собесу сами? Подготовка к собеседованию: QA-автоматизатор