В чем разница между юнит, мок, смок и интеграционным тестированием?
Что проверяют
Различаете ли вы уровни тестирования и приёмы, которыми тесты пишутся. Подвох в самом вопросе: «мок» это не вид тестирования, а тестовый двойник. Следом обычно спрашивают, как устроен набор тестов в вашем фронтенд-проекте и что именно вы мокаете.
Как отвечать
Сразу разведите понятия, а потом пройдитесь по каждому с инструментами:
- юнит-тест: проверяет одну единицу в изоляции, будь то функция, хук, редьюсер или маленький компонент. Быстрый, сотни таких проходят за секунды. Во фронтенде это Vitest или Jest, для компонентов React Testing Library;
- мок: подмена зависимости, чтобы изолировать проверяемый код. Бывают заглушки (stub), шпионы (spy), фейки и собственно моки, которые проверяют факт и аргументы вызова. Инструменты:
vi.fn(),vi.mock(),jest.fn(), а для сети MSW, который перехватывает запросы и отдаёт заранее описанные ответы; - интеграционный тест: несколько частей вместе. Для фронтенда это компонент со стором, роутером и формой, где сеть подменена через MSW. Либо фронтенд против настоящего API на тестовом стенде;
- смок-тест: короткий прогон самого главного после сборки или деплоя: приложение открывается, логин проходит, ключевые страницы отдают контент. Обычно это несколько сценариев в Playwright или Cypress, и если они падают, сборку дальше не тестируют.
Хорошо упомянуть баланс. Классическая пирамида держит большинство тестов на уровне юнитов, а для фронтенда часто приводят «трофей» Кента Доддса, где основной вес на интеграционных тестах компонентов: они ловят больше реальных ошибок на единицу усилий.
Где спотыкаются
Ставят мок в один ряд с юнитом и смоком, как отдельный вид тестирования. Моки используются на любом уровне, кроме тех, где смысл как раз в настоящих зависимостях.
Путают смок с регрессом или с sanity. Смок широкий и поверхностный, он отвечает на вопрос «стоит ли тестировать эту сборку дальше», а не проверяет всё подряд.
Мокают всё и проверяют детали реализации: внутренний стейт, число вызовов setState. Такие тесты зелёные при сломанном интерфейсе и красные после безобидного рефакторинга. Проверять стоит то, что видит пользователь.