Всем привет, на связи Surf. Ранее мы рассмотрели процесс создания небольшого приложения с использованием пакета Elementary и разобрали, как он устроен. Теперь поговорим о тестировании.  Elementary: новый взгляд на архитектуру Flutter-приложений Как устроен Elementary В статье расскажу, какие виды тестов бывают, и на примере покажу, как покрыть тестами приложение, написанное при помощи Elementary. Пакет доступен на pub.dev. Исходный код можно посмотреть на GitHub. В официальной документации есть три базовых вида тестов: Unit, Widget, Integration. Unit-тест проверяет одну функцию, метод или класс. Цель — убедиться, что функция выполняется правильно в различных условиях. Widget-тест проверяет один виджет. Цель — убедиться, что пользовательский интерфейс виджета выглядит и ведёт себя так, как ожидалось. Тестирование виджета включает несколько классов и требует тестовой среды: она обеспечивает соответствующий контекст. Integration-тест проверяет полное приложение или большую его часть. Цель — убедиться, что все виджеты и сервисы работают вместе, как ожидалось. Кроме того,  интеграционные тесты используют для проверки производительности приложения. Surf использует ещё один тип тестов — Golden. В официальной документации о нём не упоминается, но благодаря пакету golden_toolkit golden-тесты во Flutter стали возможны.  Golden-тест проверяет отдельные виджеты и целый экран. Визуальное представление  компонента сравнивается с предыдущими результатами тестов.  Покроем тестами готовое приложение, которое писали в рамках статьи «Elementary: новый взгляд на архитектуру Flutter-приложений». Проверять визуальное представление будем при помощи golden-тестов. Их легко освоить и поддерживать —  если правильно соблюдать зависимости. Если вы используете IDEA, добавьте конфигурацию запуска теста для генерации golden. Также генерацию golden-тестов можно выполнить через CLI при помощи команды. Перед началом работы с golden-тестами нужно добавить конфигурацию: положить в папку тест flutter_test_config.dart. Код ниже выполняется при каждом тесте и подгружает шрифты. Когда команда генерации голденов будет выполнена, получим набор изображений: они будут расположены в директории с файлом теста. За счёт мокированного интерфейса можно задавать различные сценарии и получать визуальные представления. Магия простоты заключается в том, что ещё на этапе написания WM мы создаём интерфейс, который и определяет набор параметров. Далее просто мокируем нужные значения и прогоняем через тест.  Для тестирования WidgetModel из пакета Elementary необходимо подключить библиотеку elementary_test: она предлагает несколько удобных инструментов для тестирования. testWidgetModel — функция самого теста. При прохождении WidgetModel она описывает его поведение и проверяет результат. Функция также использует тестер для манипуляции фазами жизненного цикла WidgetModel, а BuildContext — для их имитации. При написании теста стоит держать в голове, что окружение вокруг тестируемого объекта может быть полностью замокировано. Для тестирования модели используем unit-тесты. Перед написанием желательно ознакомиться с набором готовых матчеров: same, isTrue, isFalse, returnsNormally и так далее. Инструкция по проверке покрытия испытания: Собираем информацию о покрытии тестами.  Генерируем HTML-отчёт.  Открываем сгенерированный отчёт.  Получаем детальную информацию о состоянии покрытия тестами. Также можно посмотреть места, ещё не покрытые тестами. Это очень удобный инструмент, если вы активно пишете тесты. Мы на практике увидели, что приложение, написанное при помощи пакета Elementary, можно легко протестировать всеми видами тестов. Это стало возможно благодаря разделению приложения на слои и отсутствию большой связанности между ними. Исходный код с приложением и тестами Больше полезного про Flutter — в телеграм-канале Surf Flutter Team. Публикуем кейсы, лучшие практики, новости и вакансии Surf, а также проводим прямые эфиры. Присоединяйтесь!  Flutter разработчик