Что использовал для написания widget-тестов во Flutter?

«Что использовал для написания widget-тестов во Flutter?» — вопрос из категории Тестирование, который задают на 29% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для widget-тестов я использую встроенный пакет flutter_test. Его ключевые инструменты:

  • testWidgets(): Функция для объявления теста.
  • WidgetTester: Предоставляет методы для рендеринга виджетов (pumpWidget), взаимодействия с ними (tap, enterText) и управления временем (pumpAndSettle).
  • Finder: Для поиска виджетов в дереве (find.text(), find.byKey(), find.byType()).
  • Matcher: Для проверок (findsOneWidget, findsNothing, findsNWidgets).

Пример теста кнопки-счётчика из моего проекта:

import 'package:flutter_test/flutter_test.dart';

void main() {
  testWidgets('Counter increments when + button is pressed', (tester) async {
    // 1. Рендерим виджет
    await tester.pumpWidget(const MyApp());

    // 2. Проверяем начальное состояние
    expect(find.text('0'), findsOneWidget);
    expect(find.text('1'), findsNothing);

    // 3. Имитируем действие пользователя
    await tester.tap(find.byIcon(Icons.add));
    await tester.pump(); // Триггерим перестроение

    // 4. Проверяем результат
    expect(find.text('0'), findsNothing);
    expect(find.text('1'), findsOneWidget);
  });
}

Дополнительные инструменты в моём стеке:

  • mocktail: Для создания моков (предпочитаю его mockito, так как не требует генерации кода).
  • bloc_test: Для тестирования BLoC/Cubit (интегрируется с flutter_test).
  • golden_toolkit: Для golden-тестов (сравнения скриншотов).

Ключевая практика — это изоляция тестов: использование setUp для подготовки моков и setUpWidgetTester для кастомизации среды (например, размера экрана).