javascript42
Главная
Все учебники
Блог
Учебник Jest
Введение
Что такое Jest и зачем он нужен
История создания и развития
Философия и основные принципы
Сравнение с другими фреймворками тестирования
Установка и настройка окружения
Структура проекта с Jest
Первый тест: Hello World
Основы тестирования
Анатомия теста
Функции describe и test
Утверждения и матчеры
Группировка тестов
Хуки жизненного цикла: beforeEach, afterEach, beforeAll, afterAll
Пропуск и изоляция тестов
Режим only и skip
Организация тестовых файлов
Соглашения по именованию
Матчеры
Базовые матчеры: toBe, toEqual
Матчеры истинности
Числовые матчеры
Строковые матчеры и регулярные выражения
Матчеры для массивов и итерируемых объектов
Матчеры для объектов
Матчеры для исключений
Матчеры для промисов
Асинхронные матчеры
Создание пользовательских матчеров
Инверсия матчеров с not
Конфигурация Jest
Файл jest.config.js
Основные параметры конфигурации
Настройка путей и алиасов
Настройка окружения тестирования
Конфигурация coverage
Игнорирование файлов и директорий
Настройка таймаутов
Глобальные переменные
Множественные конфигурации
Переопределение конфигурации для отдельных тестов
Мокирование
Концепция моков и их назначение
Функция jest.fn()
Отслеживание вызовов моков
Возвращаемые значения и реализации
Мокирование модулей с jest.mock()
Автоматическое и ручное мокирование
Частичное мокирование модулей
Мокирование ES6 классов
Мокирование зависимостей
Очистка и сброс моков
Шпионы с jest.spyOn()
Мокирование таймеров
Мокирование системного времени
Мокирование глобальных объектов
Асинхронное тестирование
Тестирование колбэков
Тестирование промисов
Async/await в тестах
Обработка ошибок в асинхронном коде
Тестирование Promise.all и Promise.race
Таймауты для асинхронных тестов
Тестирование EventEmitter
Тестирование setTimeout и setInterval
Тестирование микрозадач и макрозадач
Тестирование DOM
Настройка DOM окружения
JSDOM и его возможности
Тестирование манипуляций с DOM
События и их симуляция
Тестирование форм
Тестирование делегирования событий
Работа с querySelector и querySelectorAll
Тестирование динамического контента
Снимки тестирования
Концепция snapshot testing
Создание снимков
Обновление снимков
Инлайн-снимки
Снимки свойств объектов
Сериализаторы снимков
Пользовательские сериализаторы
Лучшие практики работы со снимками
Когда использовать и когда избегать снимков
Покрытие кода
Что такое code coverage
Настройка сбора покрытия
Типы покрытия: lines, branches, functions, statements
Отчеты о покрытии
Пороги покрытия
Игнорирование кода при подсчете покрытия
Интеграция с CI/CD
Анализ и улучшение покрытия
Тестирование React компонентов
React Testing Library vs Enzyme
Установка и настройка React Testing Library
Рендеринг компонентов
Queries: getBy, queryBy, findBy
Тестирование пользовательских взаимодействий
Тестирование событий
Тестирование хуков
Тестирование контекста
Тестирование условного рендеринга
Тестирование списков и ключей
Тестирование форм и валидации
Асинхронное тестирование компонентов
Тестирование роутинга
Мокирование компонентов
Снимки React компонентов
Продвинутые техники
Параметризованные тесты
Использование test.each
Генерация тестовых данных
Фабрики и фикстуры
Тестирование граничных случаев
Property-based testing
Тестирование производительности
Отладка тестов
Режим watch и его возможности
Фильтрация тестов
Параллельное и последовательное выполнение
Изоляция тестов
Управление зависимостями между тестами
Интеграционное тестирование
Отличия от юнит-тестов
Стратегии интеграционного тестирования
Тестирование взаимодействия модулей
Тестирование API запросов
Мокирование HTTP запросов
Использование MSW (Mock Service Worker)
Тестирование баз данных
Тестирование файловой системы
Управление тестовым окружением
End-to-End тестирование с Jest
Место Jest в E2E тестировании
Интеграция с Puppeteer
Интеграция с Playwright
Настройка браузерного окружения
Тестирование сценариев пользователя
Скриншоты и визуальное тестирование
Тестирование на разных устройствах
Управление состоянием приложения
TypeScript и Jest
Настройка Jest для TypeScript
Ts-jest и его конфигурация
Типизация тестов
Типизация моков
Типизация пользовательских матчеров
Решение проблем с типами
Тестирование типов
Оптимизация и производительность
Ускорение выполнения тестов
Кэширование
Параллелизация
Оптимизация импортов
Уменьшение объема тестовых данных
Профилирование тестов
Выявление медленных тестов
Стратегии рефакторинга
Непрерывная интеграция
Запуск тестов в CI
Конфигурация для GitHub Actions
Конфигурация для GitLab CI
Конфигурация для Jenkins
Конфигурация для Travis CI
Репортинг результатов
Работа с артефактами
Кэширование в CI
Стратегии при падении тестов
Отладка и устранение проблем
Методы отладки тестов
Использование debugger
Логирование в тестах
Анализ трассировки стека
Типичные ошибки и их решения
Проблемы с асинхронностью
Проблемы с моками
Проблемы с таймаутами
Проблемы с памятью
Инструменты диагностики
Миграция и обновление
Миграция с других фреймворков
Миграция с Mocha
Миграция с Jasmine
Обновление версий Jest
Breaking changes и их обработка
Постепенная миграция
Codemods для автоматизации
Лучшие практики
Принципы написания хороших тестов
AAA паттерн: Arrange, Act, Assert
Именование тестов
Один тест - одна проверка
Независимость тестов
Читаемость и поддерживаемость
DRY в тестах: когда применять
Тестовая пирамида
Баланс между разными типами тестов
Что тестировать, а что нет
Тестирование поведения vs реализации
Рефакторинг тестов
Документирование через тесты
Специализированные сценарии
Тестирование библиотек
Тестирование Node.js приложений
Тестирование Express приложений
Тестирование GraphQL
Тестирование WebSocket
Тестирование воркеров
Тестирование CLI приложений
Тестирование серверного рендеринга
Тестирование микросервисов
Расширение Jest
Создание плагинов
Создание пресетов
Создание трансформеров
Создание reporter'ов
Создание test runner'ов
Программный API Jest
Интеграция с другими инструментами
Публикация расширений