Вопросы для собеседования тестировщика
Готовый набор для интервьюера: 36 вопросов с тезисами эталонного ответа, задача, рубрика и план встречи.
На собеседовании тестировщика хорошо работает схема на 60 минут: 3-4 устных вопроса по стеку, практический кейс, проектирование для middle и выше и вопросы кандидата. Ниже вопросы по грейдам из базы Техпрогона: у каждого тезисы, которые должен назвать сильный кандидат.
Всего в базе по этой роли 174 устных вопросов с чек-листом ответа.
Как построить техсобес на 60 минут
0-5 мин
Знакомство
Кто вы, формат встречи, кандидат коротко о себе и последнем проекте.
5-20 мин
Вопросы по стеку
3-4 устных вопроса из набора ниже. Сверяйте ответ с тезисами.
20-45 мин
Практический кейс
Ситуация из работы. Важно, как кандидат рассуждает и что уточняет.
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
Если ответил, копните глубже
Чем отличается WHERE от HAVING? Приведи пример, где нужны оба.
Что хотим услышать
- WHERE фильтрует строки до группировки, HAVING фильтрует группы после
- В WHERE нельзя агрегаты, в HAVING можно
- Порядок: FROM, WHERE, GROUP BY, HAVING, SELECT
- Условия без агрегатов лучше писать в WHERE: меньше строк до группировки
- Пример: WHERE status = 'paid' и HAVING SUM(total) > 10000
Если ответил, копните глубже
Объясни, что такое CORS и как он работает.
Что хотим услышать
- Same-origin policy: скрипт не может читать ответы другого origin (схема, хост, порт)
- CORS: сервер заголовками
Access-Control-Allow-*разрешает конкретным origin читать ответы - Проверяет браузер, сервер отвечает всегда; вне браузера CORS не действует
- Простые запросы уходят сразу, остальные после preflight OPTIONS
- С куками нужен
credentials: 'include',Allow-Credentials: trueи точный origin вместо*
Если ответил, копните глубже
Объясни, зачем фронтенд-проекту сборщик и что происходит с кодом от исходников до файлов в dist.
Что хотим услышать
- граф зависимостей от точки входа
- трансформация: TS, JSX, современный синтаксис, CSS
- резолв пакетов из node_modules
- склейка в чанки, минификация, tree shaking
- хеши в именах для долгого кеша
- dev-сервер с HMR и source maps
Если ответил, копните глубже
Назовите ваши сильные стороны.
Что хотим услышать
- Две-три стороны, а не список из десяти
- Каждая подкреплена примером
- Стороны связаны с вакансией
- Нет пустых слов вроде «стрессоустойчивый, коммуникабельный» без доказательств
- Уверенно, без хвастовства
Если ответил, копните глубже
Что делает баг-репорт хорошим?
Что хотим услышать
- Понятный заголовок: где и что, без эмоций
- Окружение и версия сборки
- Точные шаги с данными, которые воспроизведёт любой
- Фактический и ожидаемый результат, ожидаемое со ссылкой на источник
- Доказательства: скриншот, видео, логи, ответы сервера
- Один дефект на репорт, корректная серьёзность, нет лишнего
Если ответил, копните глубже
Что такое REST API? Объясни так, как объяснил бы на собеседовании на тестировщика.
Что хотим услышать
- Архитектурный стиль поверх HTTP, где всё ресурс с адресом
- Действие задаёт HTTP-метод: GET читает, POST создаёт, PUT/PATCH меняют, DELETE удаляет
- Сервер не хранит состояние клиента между запросами
- Результат передаётся кодом ответа и телом, обычно JSON
- Договор описывают в OpenAPI, по нему и тестируют
Если ответил, копните глубже
Расскажи, какие бывают JOIN и как каждый влияет на число строк в результате.
Что хотим услышать
- INNER: только пары, где условие ON истинно
- LEFT/RIGHT: все строки одной стороны, у недостающей стороны NULL
- FULL: все строки обеих сторон
- CROSS: декартово произведение, N × M строк
- Связь один ко многим размножает строки «одной» стороны, два таких JOIN перемножают
- Строки с NULL в ключе не соединяются: NULL = NULL не true
Если ответил, копните глубже
Чем отличаются GET и POST? Ответ «у POST есть тело» не засчитывается.
Что хотим услышать
- GET читает и безопасен, POST меняет состояние
- GET идемпотентен, POST нет: его нельзя молча повторять
- GET кешируется браузером и прокси, POST по умолчанию нет
- Параметры GET в URL: попадают в логи и историю, длина ограничена серверами
- GET можно добавить в закладки и prefetch, поэтому нельзя менять данные по GET
Если ответил, копните глубже
Зачем разработчику Docker Compose и как ты его используешь?
Что хотим услышать
- Поднять зависимости одной командой: база, Redis, очередь
- Одинаковые версии сервисов у всей команды и в CI
- Сервисы общаются по именам в общей сети
- Тома для данных базы, bind mount для кода
- healthcheck и depends_on с condition для порядка старта
Если ответил, копните глубже
Какие у вас слабые стороны?
Что хотим услышать
- Назвал реальную слабость, а не штамп
- Слабость не критична для роли
- Рассказал, что делает, чтобы её компенсировать
- Есть пример прогресса
- Коротко, без самобичевания
Если ответил, копните глубже
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, брутфорс ограничен
Если ответил, копните глубже
Спроектируй схему базы для заказов интернет-магазина: клиенты, товары, заказы, оплаты. Какие таблицы, ключи и ограничения?
Что хотим услышать
- Таблицы customers, products, orders, order_items, payments и их связи
- order_items как связь заказа и товара с qty и ценой на момент покупки
- Ограничения: FK, NOT NULL, CHECK (qty > 0), UNIQUE там, где нужно
- Типы: numeric или копейки для денег, timestamptz для времени, статус через CHECK или enum
- Индексы на FK и под частые запросы (заказы клиента по дате)
- Платежи отдельной таблицей с идемпотентным внешним id от платёжки
Если ответил, копните глубже
Чем отличаются сессии на куках и JWT? Что бы ты выбрал для обычного веб-приложения?
Что хотим услышать
- Сессия: id в куке, состояние на сервере (Redis/БД), отзыв мгновенный
- JWT: состояние в самом токене, проверка подписью без базы, сложно отозвать
- Для JWT нужна пара короткий access + отзываемый refresh
- Хранение: HttpOnly кука защищает от XSS, но нужна защита от CSRF (SameSite)
- Выбор по контексту: одно веб-приложение проще на сессиях, много сервисов и мобильные клиенты удобнее на токенах
Если ответил, копните глубже
Как бы ты построил CI/CD для веб-приложения с нуля?
Что хотим услышать
- На каждый PR: npm ci, линтер, типы, unit-тесты, сборка
- Быстрые проверки первыми, независимые джобы параллельно, кеш зависимостей
- Защита ветки main: мерж только с зелёным CI и ревью
- Сборка один раз, артефакт (образ) с версией продвигается по стендам
- Деплой на стенд автоматически, на прод с подтверждением или автоматически при хорошем покрытии
- План отката и миграции, совместимые с предыдущей версией
Если ответил, копните глубже
Почему вы ищете новую работу?
Что хотим услышать
- Причина через цель, а не через бегство
- Ни слова негатива о текущем работодателе
- Показано, что на текущем месте был рост и результаты
- Связка с этой вакансией
- Коротко: до минуты
Если ответил, копните глубже
Что ты делаешь между «увидел баг» и «завёл баг-репорт»?
Что хотим услышать
- Повторить, чтобы убедиться, что воспроизводится, и найти минимальные шаги
- Проверить, не дубликат ли и не известная ли это проблема
- Сузить условия: другой браузер, другая учётка, другие данные
- Посмотреть Network и Console: фронт или бэк
- Проверить, есть ли в проде или появилось в этой сборке
- Собрать доказательства и оценить серьёзность
Если ответил, копните глубже
Как ты используешь SQL и базу данных в работе тестировщика? Приведи примеры запросов.
Что хотим услышать
- Проверка результата: запись после API-запроса, поля, статусы, связанные таблицы
- Поиск дефектов в данных: дубли через GROUP BY HAVING, сироты через LEFT JOIN или NOT EXISTS, расхождения сумм
- Подготовка данных: нужные состояния, которые долго создавать через интерфейс
- Разбор бага: на каком шаге данные стали неверными
- Осторожность: NULL-ловушки, доступ только на чтение к важным стендам, без правок в проде
Если ответил, копните глубже
Индекс есть, а в плане Seq Scan. Назови возможные причины и как каждую проверить.
Что хотим услышать
- Низкая селективность: нужна большая доля строк, seq scan дешевле
- Функция или приведение типа над колонкой: нужен индекс по выражению или переписать условие
- Условие не по ведущей колонке составного индекса
- Устаревшая статистика: оценки rows не совпадают с фактом, помогает ANALYZE
- Маленькая таблица, LIKE с % в начале, OR по разным колонкам
- Проверка: EXPLAIN (ANALYZE, BUFFERS), сравнить оценки с фактом
Если ответил, копните глубже
Чем отличаются HTTP/1.1, HTTP/2 и HTTP/3? Какие проблемы решала каждая версия?
Что хотим услышать
- Семантика (методы, статусы, заголовки) одна, меняется транспорт
- HTTP/1.1: запросы по очереди в соединении, браузер держит около 6 соединений
- HTTP/2: бинарные фреймы, мультиплексирование, HPACK, одно соединение
- HTTP/2 упирается в head-of-line blocking TCP при потерях
- HTTP/3: QUIC поверх UDP, независимые потоки, TLS встроен, быстрее рукопожатие, миграция соединения
Если ответил, копните глубже
Как бы ты написал Dockerfile для Node.js-сервиса в прод? Что в нём важно?
Что хотим услышать
- Конкретный базовый образ (node:22-alpine или slim), не latest
- Порядок слоёв: сначала манифесты и npm ci, потом исходники
- Multi-stage: сборка отдельно, в финале только dist и прод-зависимости
- .dockerignore: node_modules, .git, .env
- USER node, не root
- Exec-форма CMD, healthcheck, секреты не в образе
Если ответил, копните глубже
Почему вы считаете себя middle-разработчиком?
Что хотим услышать
- Показал самостоятельность: вёл задачу сам от требований до прода
- Привёл пример фичи, которую довёл целиком
- Упомянул работу с неясными требованиями
- Есть результат с цифрой
- Не завысил и не принизил себя
Если ответил, копните глубже
Senior: 12 вопросов
Глубина и опыт: границы подходов, решения в продакшене.
Разработчик раз за разом отклоняет твои баги как «не баг» или «не воспроизводится». Как выстроишь работу?
Что хотим услышать
- Разобрать конкретные случаи: в чём причина отклонений
- Улучшить баг-репорты: окружение, данные, видео, логи, ожидаемое со ссылкой на источник
- Договориться о критериях: что считается дефектом, кто решает спорные случаи
- Спорные случаи к владельцу продукта, а не в переписку
- Показывать вживую и разбирать вместе, без обвинений
Если ответил, копните глубже
Чем тестирование GraphQL отличается от REST и что ты проверишь?
Что хотим услышать
- Один эндпоинт, ответ зависит от выбранных полей; проверять data и errors, а не только код
- Частичные ответы: ошибка в одном поле не ломает остальные
- Авторизация на уровне полей и резолверов, а не только эндпоинта
- Безопасность и нагрузка: глубина и сложность запросов, батчинг, интроспекция в проде
- Производительность: N+1 в резолверах, пагинация списков
Если ответил, копните глубже
Расскажите, как в PostgreSQL устроен MVCC, откуда берутся мёртвые строки и зачем нужен VACUUM.
Что хотим услышать
UPDATEсоздаёт новую версию строки, старая остаётся сxmax;DELETEтолько помечает версию- Каждая транзакция видит версии по своему снимку, поэтому чтение не блокирует запись и наоборот
- VACUUM удаляет версии, которые уже никому не видны, обновляет visibility map и замораживает старые строки
- Долгие транзакции и забытые слоты репликации мешают очистке и раздувают таблицы
- Autovacuum настраивают по таблицам:
autovacuum_vacuum_scale_factor, лимиты стоимости; мониторинг черезpg_stat_user_tables - HOT-обновления и
fillfactorуменьшают нагрузку на индексы
Если ответил, копните глубже
VACUUM FULL отличается от обычного?Как бы ты сделал надёжный клиент WebSocket для чата, который переживает обрывы сети?
Что хотим услышать
- Реконнект с экспоненциальной задержкой и джиттером, сброс задержки после успеха
- Heartbeat: ping/pong с таймаутом, при пропуске закрыть и переподключиться
- Нумерация сообщений: после реконнекта клиент сообщает последний id, сервер досылает пропущенное
- Очередь исходящих сообщений с клиентскими id, идемпотентность на сервере против дублей
- Реакция на
online/offlineи видимость вкладки, повторная авторизация при истёкшем токене
Если ответил, копните глубже
Ты приходишь в проект без тестов. Как выстроишь стратегию тестирования?
Что хотим услышать
- начать с самого рискованного и ценного для бизнеса: оплата, вход, ключевые сценарии
- несколько e2e smoke-тестов на критичные пути
- unit-тесты на чистую логику: расчёты, форматирование, утилиты
- интеграционные тесты компонентов и API на новых и изменяемых местах
- тесты в CI как обязательная проверка PR
- регрессионный тест на каждый найденный баг, борьба с флаки
Если ответил, копните глубже
Вы претендуете на senior. Расскажите о себе.
Что хотим услышать
- Назван масштаб: команда, нагрузка, пользователи или деньги
- Есть решения, которые повлияли дальше своего кода
- Есть метрики результата
- Упомянуто влияние на команду: менторинг, процессы, ревью
- Уложился в 2 минуты, не утонул в деталях
Если ответил, копните глубже
Как выстроить регрессионное тестирование в продукте с релизами раз в две недели?
Что хотим услышать
- Анализ влияния изменений для выбора объёма
- Приоритизация тест-кейсов по рискам и критичности сценариев
- Автоматизация стабильной части регрессии и запуск в CI
- Ручная регрессия на рискованных и новых местах
- Регулярная чистка набора: удалять устаревшее, добавлять тесты по утёкшим багам
- Метрики: время регрессии, утечка дефектов, флаки
Если ответил, копните глубже
Как ты протестируешь эндпоинт списка с пагинацией, фильтрами и сортировкой?
Что хотим услышать
- Границы: limit 0, 1, максимум и больше максимума, отрицательные и нечисловые значения
- Полнота: сумма элементов всех страниц равна total, нет дублей и пропусков
- Стабильность: вставка или удаление записи между страницами, стабильная сортировка при равных ключах
- Фильтры: каждый отдельно, комбинации, пустой результат, неизвестные значения
- Безопасность и производительность: инъекция в sort, огромный limit, чужие данные в выдаче
Если ответил, копните глубже
На проде в логах появились ошибки deadlock detected. Как вы будете разбираться и что сделаете, чтобы они ушли?
Что хотим услышать
- Deadlock это цикл ожидания: транзакции держат блокировки и ждут друг друга
- PostgreSQL проверяет цикл после
deadlock_timeout(1 с по умолчанию) и откатывает одну из транзакций с ошибкой 40P01 - В логе есть оба запроса и тип блокировок; включаю
log_lock_waitsдля долгих ожиданий - Главное лечение: единый порядок взятия блокировок, короткие транзакции, блокировка заранее через
SELECT ... FOR UPDATEв порядке ключа - Приложение должно уметь повторять транзакцию при 40P01 и 40001
Если ответил, копните глубже
FOR UPDATE отличается от FOR NO KEY UPDATE?lock_timeout?Первая загрузка сайта занимает 4 секунды у пользователей из регионов. Как бы ты искал, где теряется время, и что делал?
Что хотим услышать
- Измерить: Navigation Timing и RUM по этапам (DNS, connect, TLS, TTFB, загрузка, рендер), Lighthouse и WebPageTest
- Сеть: CDN ближе к пользователю, HTTP/2 или HTTP/3, preconnect к сторонним доменам
- Сервер: медленный TTFB → кеширование, отдача статики с CDN, 103 Early Hints
- Ресурсы: Brotli, меньше JS, code splitting, оптимизированные картинки с размерами
- Рендер: критический CSS, defer для скриптов, без блокирующих сторонних скриптов
Если ответил, копните глубже
Чем, по-вашему, резюме senior должно отличаться от резюме middle?
Что хотим услышать
- Акцент на масштаб и влияние, а не на список фич
- Метрики бизнес-эффекта
- Лидерство: менторинг, процессы, архитектурные решения
- Компактность: старый опыт свёрнут
- Понимание, что резюме под роль, а не под всё сразу
Если ответил, копните глубже
Задачи копятся в колонке «Тестирование», релизы задерживаются. Что будешь делать как ведущий тестировщик?
Что хотим услышать
- Измерить: где задачи ждут, сколько времени, почему возвращаются
- Ограничить незавершённую работу (WIP), чтобы разработчики помогали довести задачи, а не брали новые
- Shift-left: критерии приёмки и тест-идеи до разработки, разработчики пишут тесты
- Автоматизировать регрессию и смоук в CI
- Риск-ориентированный объём проверок вместо «всё вручную»
- Качество общая ответственность: разработчик проверяет свою задачу до передачи
Если ответил, копните глубже
Практическое задание
Двойное списание
Найди заказы, по которым прошло больше одного успешного платежа.
Колонки: order_id, cnt. Порядок строк не важен.
- Подсказка, если застрял: Отфильтруй
status = 'success'до группировки. - Подсказка, если застрял: Условие на число строк в
HAVING.
Эталон, тесты и таймер открываются интервьюеру в живом моке
Рубрика оценки: 1-4 балла
Критерии рассуждения для кейса. Ставьте балл по каждому пункту, сумма показывает картину лучше, чем «понравился или нет».
Уточнил цель и контекст
Для кого, зачем, какие ограничения по срокам и ресурсам
Задал вопросы до решения
Не бросился решать по первому впечатлению
Предложил подход и альтернативы
Назвал 2 варианта и почему выбрал один
Назвал метрики и риски
Как поймёт, что решение сработало, что может пойти не так
Довёл до конкретного плана
Шаги, ответственные, сроки
Опирался на свой опыт
Пример из реальной работы, а не пересказ учебника
Принял возражение и поправился
Без спора ради спора
Мок-собес без регистрации для интервьюера
Хотите проверить кандидата на задаче с эталоном и рубрикой? Так работает живой мок в Техпрогоне.
Кандидат готовится в Техпрогоне и на задаче открывает ступень «Живой мок».
Он присылает вам ссылку. Вы открываете её без регистрации.
У вас условие, эталон, рубрика, уточняющие вопросы и таймер.
Вы ставите оценки и вердикт, кандидат сразу видит результат.
Для интервьюера бесплатно. Ссылку создаёт кандидат на тарифе Рывок
Наборы для других ролей
Готовитесь к собесу сами? Подготовка к собеседованию: QA-инженер (ручное)