Sobes.tech
Назад к вопросам
Junior — Middle
122

Какими инструментами и подходами вы пользовались для создания тестов виджетов?

Компании, где спрашивали
AndersenAndersen

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Ожидают услышать, что для widget testing в Flutter используются flutter_test, WidgetTester, pumpWidget, pump, find, tap, enterText и expect. Важно показать понимание разницы между widget tests, unit tests и integration tests. Также плюс, если есть опыт стабилизации тестов через pumpAndSettle, подмену зависимостей и тестирование состояния/навигации.

Определение:

Тесты виджетов в Flutter — это проверки поведения отдельного виджета или небольшого участка UI в изолированной среде. Они позволяют убедиться, что виджет правильно строится, реагирует на нажатия, ввод текста, изменения состояния и отображает нужные элементы. Обычно такие тесты пишутся через flutter_test и выполняются быстрее, чем интеграционные тесты.

Пример использования:

Например, можно проверить, что кнопка отображается на экране и после нажатия меняет текст счетчика.

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';

void main() {
  testWidgets('counter increments on tap', (WidgetTester tester) async {
    await tester.pumpWidget(const MaterialApp(home: CounterPage()));

    expect(find.text('0'), findsOneWidget);
    expect(find.text('1'), findsNothing);

    await tester.tap(find.byType(ElevatedButton));
    await tester.pump();

    expect(find.text('1'), findsOneWidget);
  });
}

class CounterPage extends StatefulWidget {
  const CounterPage({super.key});

  @override
  State<CounterPage> createState() => _CounterPageState();
}

class _CounterPageState extends State<CounterPage> {
  int value = 0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(child: Text('$value')),
      floatingActionButton: ElevatedButton(
        onPressed: () => setState(() => value++),
        child: const Text('Add'),
      ),
    );
  }
}

Пояснение кода:

Сначала тест запускает виджет через pumpWidget, помещая его в тестовую среду Flutter. Затем через find.text проверяется исходное состояние — на экране должен быть 0. После этого тест находит кнопку по типу виджета, имитирует нажатие через tap и вызывает pump, чтобы Flutter перестроил UI. В конце проверяется, что текст изменился на 1, значит логика обработки нажатия работает.

Ключевые моменты:

  • Для widget tests обычно используют flutter_test и WidgetTester.
  • pumpWidget поднимает дерево виджетов в тестовой среде, а pump обновляет кадр после действий.
  • Для поиска элементов удобны find.text, find.byType, find.byKey.
  • Для взаимодействия применяются tap, enterText, scroll, drag.
  • Для асинхронных сценариев часто нужен pumpAndSettle, чтобы дождаться завершения анимаций и микротасков.
  • Хорошая практика — изолировать зависимости: подменять API, репозитории, сервисы и проверять не только отрисовку, но и реакцию UI на состояние.