Закончился воркшоп по тестированию реакта. Научился совершенно новому подходу к тестированию фронта. Познакомился в новыми инструментами для логгирования и дебага. Мы тестировали чистый реакт, но подходы можно применить в любом проекте, разница может быть при работе с побочными эффектами. Очень помогли пройденые проекты хекслета. В последний день вспоминал/собирал код из них, оставалось только соединить с реактом или протестировать.
Решил выписать тезисы после воркшопа для себя.
- Цель тестирования: проверка работоспособности приложения, а не компоненты внутри него
- Работаем только с готовой версткой, не завязываемся на компоненты (внутреннюю реализацию)
- Не надо тестировать статичный рендеринг, надо тестировать поведение
- Матчеры должны соответствовать семантике операции
- Матчеры должны давать такой вывод, в котором показывается DOM без необходимости отдельно его дебажить
- Каждый тест должен быть на 100 процентов изолирован от других и работать, как будто других не существует
- Не тестировать стейт и пропсы
- Использовать Page Object для выборок
- Тестировать по минимуму
- Использовать логгирование в тестах
- Снапшоты только для тестирования верстки, например, библиотека компонентов
- Stub используются для подмены, когда есть побочные эффекты (запросы, куки)
- Mock используются для проверки вызова функции, имеют смысл при тестировании таймеров, в большинстве случаев бесполезны и даже вредны
- Тесты не гарантируют работоспобности (но выбора нет)
- Сначала тестировать нормальные случаи, возможные ошибки не так важны, нет задачи 100% покрытия
- Если не знаешь писать тест или нет, не пиши (не перетестчивать)
- В идеале писать тесты устойчивые к изменениям в коде
Ссылки
- Матчеры enzyme для html
- Page object
- Статья “Начинаем писать тесты (правильно)”
- Видео “Начинаем писать тесты (правильно)”
- Бережливое тестирование, или Почему модульные тесты хуже, чем вы думаете
Спасибо Кириллу за воркшоп. Попробую применить знания на работе, может быть напишу статью, как получилось применить знания в связке react, graphql.