Интервью-вопрос
Какие тесты вы писали?
Отвечайте через цель тестов, конкретные сценарии и стабильность проверки. Не ограничивайтесь списком Jest, React Testing Library, Cypress или Playwright.
- Добавлен
- Редакция
Подготовьте короткий ответ и пару деталей на случай уточняющих вопросов.
Мини-квиз
Проверка перед разбором
Несколько быстрых вопросов перед разбором. Так проще поймать места, которые только кажутся понятными.
Вопрос 1 из 50 правильно
Разбор
Разобраться, а не зазубрить
Дальше разбираем суть, типичные уточнения и места, где легко сказать лишнее или перепутать термины.
Базовая идея
Вопрос "Какие тесты вы писали?" не про то, сколько названий библиотек вы помните. Хороший ответ показывает три вещи. Что вы проверяли, зачем это было нужно и как сделали тест надежным.
Удобная структура ответа:
- Назовите уровни тестов, с которыми работали.
- Для каждого уровня дайте короткую цель.
- Выберите один конкретный пример.
- Скажите, какой баг или регрессию такой тест мог поймать.
- Честно обозначьте границу опыта.
Так вы не выглядите человеком, который просто видел Jest в package.json. Вы показываете, что воспринимаете тест как защиту продукта от конкретного риска.
Как построить ответ под свой опыт
Не надо придумывать, что вы писали все виды тестов в большом продакшене. Если реальный опыт был только с unit-тестами и компонентами, это можно подать сильно. Главное, объяснить, почему вы выбирали такие тесты и что они проверяли.
Пример ответа, если опыт был на проекте:
Я писал unit-тесты для функций форматирования и валидации, компонентные тесты для React-форм через React Testing Library и несколько интеграционных тестов на сценарии с API-моком. Например, для формы регистрации проверял обязательные поля, disabled-состояние кнопки, успешную отправку и ошибку сервера. Это помогало ловить регрессии в валидации и не выпускать форму, которая визуально работает, но отправляет неправильные данные.
Пример ответа, если опыт был меньше:
В коммерческом проекте я в основном работал с компонентными тестами и небольшими unit-тестами. E2E настраивал только в учебном проекте, поэтому не буду выдавать это за большой продакшен-опыт. Но я понимаю, что e2e лучше использовать для критичных потоков вроде логина или оформления заказа, а не для проверки каждой кнопки.
Как выбрать безопасную формулировку
Назовите 2-3 типа тестов, инструменты и один конкретный сценарий с пользой для продукта.Скажите это прямо и покажите, что понимаете границы. Что мокали, что проверяли, чего не было в продакшене.Говорите про состояния экрана: loading, success, empty и error. Если запрос зависит от поиска или id, добавьте, как защищались от race condition.Не раздувайте опыт. Расскажите, какие тесты добавили бы первыми и почему именно они закрывают риск.Свяжите инструмент с задачей. Jest или Vitest для логики, RTL для компонентов, Cypress или Playwright для e2e.Какие тесты стоит упомянуть
Для frontend обычно хватает четырех групп, если вы можете объяснить их на примерах.
Unit-тесты проверяют маленькую часть логики. Утилиту, валидацию, reducer, функцию преобразования данных. Их плюс в скорости и понятной причине падения. Практический риск, который они закрывают, это тихая поломка бизнес-правила.
Компонентные тесты проверяют UI через поведение. Что пользователь вводит, нажимает и видит. Для React это часто React Testing Library. Риск, который они закрывают, это сломанная форма, неправильное сообщение об ошибке, недоступная кнопка, потерянный фокус, отсутствие label или неверное состояние загрузки.
Интеграционные тесты проверяют связку нескольких частей. Компонент, состояние, роутинг, API-мок. Они полезны, когда баг появляется не в одной функции, а на границе между слоями.
E2E тесты проверяют полный пользовательский путь в браузере. Их стоит привязывать к дорогим ошибкам. Пользователь не может войти, оформить заказ, отправить заявку или пройти оплату. Такие тесты дают уверенность, но требуют больше времени и дисциплины с тестовыми данными.
Пример, который можно объяснить на интервью
Хороший пример не обязан быть большим. Он должен показывать, что вы проверяете поведение, а не внутренности компонента.
import { render, screen } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import { vi } from "vitest";
import { LoginForm } from "./LoginForm";
test("shows validation error for empty password", async () => {
const user = userEvent.setup();
const onSubmit = vi.fn();
render(<LoginForm onSubmit={onSubmit} />);
await user.type(screen.getByLabelText(/email/i), "user@example.com");
await user.click(screen.getByRole("button", { name: /sign in/i }));
expect(await screen.findByText(/password is required/i)).toBeInTheDocument();
expect(onSubmit).not.toHaveBeenCalled();
});Здесь вы можете сказать так. Я не проверяю внутренний state формы. Я проверяю то, что важно пользователю и продукту. Без пароля форма показывает ошибку и не отправляет данные. Такой тест переживет рефакторинг внутренней реализации, если поведение останется тем же.
Плохой пример ответа: я делал snapshot всего компонента, и если он менялся, тест падал.
Почему это риск. Большой snapshot часто падает из-за неважной правки разметки и плохо объясняет, что сломалось. Лучше использовать точечные проверки поведения. Snapshot можно оставить для редких стабильных фрагментов, но не как основной способ тестировать форму или сценарий.
Как говорить про асинхронность и API
Если вы упоминаете тесты с API, сразу покажите, что понимаете источник нестабильности. В компонентных и интеграционных тестах реальный backend обычно не нужен. Он делает тест зависимым от сети, данных и окружения. Еще один риск, это гонка запросов. Пользователь меняет фильтр, старый ответ приходит позже и перетирает новые данные.
Сильная формулировка:
Для API-сценариев я мокал ответы и проверял состояния интерфейса: loading, success, empty и error. Например, при 500 ожидал сообщение об ошибке и доступную повторную отправку. Для поиска или фильтров проверял, что устаревший ответ не перезаписывает новый результат. В e2e уже можно проверять реальную или тестовую связку, но там нужны стабильные тестовые данные и очистка после сценария.
Важно не говорить только, что вы проверяли вызов fetch. Вызов функции сам по себе не значит, что пользователь увидел правильный экран. Лучше проверять результат в UI.
Как показать зрелость в ответе
- 1Начать с короткого списка типов тестов
- 2Дать пример сценария и риск, который он закрывал
- 3Пояснить, как делали тест стабильным
- 4Честно обозначить границы своего опыта
- 1Перечислить только Jest, Cypress и coverage
- 2Не вспомнить ни одного сценария
- 3Сказать, что e2e проверяет вообще все
- 4Приписать себе опыт, который нельзя объяснить
Зрелый ответ отличается не количеством библиотек, а осознанными ограничениями. Можно прямо сказать, что быстрые unit и компонентные тесты хорошо подходят для частых запусков в pull request. E2E лучше держать для критичных потоков, потому что они медленнее, требуют тестовых данных и чаще ломаются от окружения.
Если вас спрашивают про CI, не надо уходить в DevOps-лекцию. Достаточно сказать, какие тесты запускались на каждый PR, какие отдельно, как команда смотрела отчеты и что вы делали с flaky-тестами. Это показывает, что вы думали не только о написании теста, но и о его жизни в проекте.
Практический вывод
Подготовьте заранее 2-3 своих примера. Один про маленькую логику, один про React-компонент, один про пользовательский сценарий. Для каждого примера держите короткую формулу. Что проверяли, каким инструментом, какой риск закрывали, что было бы плохим сигналом.
Не пытайтесь звучать старше своего опыта. Если вы честно говорите о границах, но объясняете trade-off и можете разобрать пример, ответ выглядит сильнее, чем набор громких слов без деталей.
Частые ошибки
Где обычно ошибаются
Проверьте формулировки, которые звучат уверенно, но на интервью быстро выдают пробелы.
- 1
Отвечать только названиями инструментов
Фраза про Jest, Cypress и React Testing Library сама по себе не показывает опыт. Лучше связать каждый инструмент с задачей. Логика, компонент, форма, API, пользовательский сценарий. Иначе следующий вопрос про конкретный тест быстро покажет пробел.
- 2
Путать тест реализации и тест поведения
Если вы проверяете внутренний state или className без причины, тест ломается при безопасном рефакторинге. Для UI обычно сильнее звучит проверка через роль, label, текст, ввод пользователя и видимый результат.
- 3
Выдумывать продакшен-опыт
Если вы говорите, что настраивали e2e в CI, будьте готовы объяснить параллельный запуск, тестовые данные и flaky-тесты. Если такого опыта не было, лучше сказать спокойно. Вы писали локально или разбирали подход на учебном проекте.
- 4
Делать реальные запросы в компонентных тестах
Реальный backend делает тест медленным и нестабильным. Такой тест может упасть из-за сети, чужих данных или недоступного стенда, хотя UI не сломан. В unit и интеграционных тестах обычно лучше мокать API или перехватывать запросы. Реальную связку стоит проверять отдельными e2e сценариями на тестовом окружении.
- 5
Не проверять состояния загрузки и гонки запросов
Если компонент делает запрос при смене фильтра, id или поисковой строки, старый ответ может прийти позже нового. Тогда пользователь увидит не те данные. Хороший тест проверяет loading, error, empty state и сценарий, где устаревший ответ не перетирает актуальное состояние UI.
- 6
Считать coverage главным показателем качества
Высокое покрытие может ничего не поймать, если тесты проверяют только рендер без смысла. На интервью лучше говорить про критичные сценарии, регрессии и риск для пользователя. Coverage можно упомянуть как вспомогательную метрику.
Follow-up
Что могут спросить дальше
Короткие ответы на вопросы, которыми проверяют ваш реальный опыт с тестами и понимание trade-off.
Живые ответы
Видео с похожим вопросом
Если найдем публичные интервью с таким вопросом, добавим их сюда. Их удобно смотреть после теории, чтобы свериться с живыми ответами.
Пока видео нет. Когда появятся подходящие публичные интервью, добавим их в этот блок, чтобы можно было сравнить разбор с тем, как отвечают реальные кандидаты.
Что такое HTTPOnly cookie 😎
HTTPOnly cookie нельзя прочитать через JavaScript, поэтому ее часто используют для хранения сессионных идентификаторов и refresh-токенов. На странице разбираем, от чего этот флаг защищает, от чего не защищает и что важно сказать на интервью.
Что такое тестирование 😎
Тестирование проверяет, что продукт работает по требованиям и не ломает пользовательские сценарии. На странице разбираем, как объяснить цель тестирования, виды проверок и роль frontend-разработчика.