Flutter - Тестирование

Тестирование - очень важный этап в жизненном цикле разработки приложения. Это гарантирует высокое качество приложения. Тестирование требует тщательного планирования и выполнения. Это также самый трудоемкий этап разработки.

Язык Dart и фреймворк Flutter предоставляют обширную поддержку для автоматического тестирования приложения.

Типы тестирования

Как правило, для полного тестирования приложения доступны три типа процессов тестирования. Они следующие -

Модульное тестирование

Модульное тестирование - самый простой способ протестировать приложение. Он основан на обеспечении правильности фрагмента кода (функции в целом) метода класса. Но он не отражает реальную среду и, следовательно, является наименьшим вариантом для поиска ошибок.

Тестирование виджетов

Тестирование виджетов основано на обеспечении правильности создания виджета, рендеринга и взаимодействия с другими виджетами, как ожидалось. Он идет еще дальше и предоставляет среду, близкую к реальному времени, для поиска дополнительных ошибок.

Интеграционное тестирование

Интеграционное тестирование включает в себя как модульное тестирование, так и тестирование виджетов, а также внешний компонент приложения, такой как база данных, веб-сервис и т. Д. Оно имитирует или имитирует реальную среду, чтобы найти почти все ошибки, но это наиболее сложный процесс.

Flutter поддерживает все типы тестирования. Он обеспечивает обширную и эксклюзивную поддержку тестирования виджетов. В этой главе мы подробно обсудим тестирование виджетов.

Тестирование виджетов

Среда тестирования Flutter предоставляет метод testWidgets для тестирования виджетов. Он принимает два аргумента -

  • Описание теста
  • Тестовый код
testWidgets('test description: find a widget', '<test code>');

Вовлеченные шаги

Тестирование виджетов включает три отдельных этапа:

  • Визуализируйте виджет в тестовой среде.

  • WidgetTester - это класс, предоставляемый платформой тестирования Flutter для создания и рендеринга виджета. Метод pumpWidget класса WidgetTester принимает любой виджет и отображает его в среде тестирования.

testWidgets('finds a specific instance', (WidgetTester tester) async { 
   await tester.pumpWidget(MaterialApp( 
      home: Scaffold( 
         body: Text('Hello'), 
      ), 
   )); 
});
  • Нахождение виджета, который нам нужно протестировать.

    • Фреймворк Flutter предоставляет множество вариантов для поиска виджетов, отображаемых в среде тестирования, и их обычно называют Finders. Наиболее часто используемые средства поиска - это find.text, find.byKey и find.byWidget.

      • find.text находит виджет, содержащий указанный текст.

find.text('Hello')
      • find.byKey находит виджет по его конкретному ключу.

find.byKey('home')
      • find.byWidget находит виджет по его переменной экземпляра.

find.byWidget(homeWidget)
  • Убедитесь, что виджет работает должным образом.

  • Фреймворк Flutter предоставляет множество опций для сопоставления виджета с ожидаемым виджетом, и они обычно называются Matchers . Мы можем использовать метод expect, предоставляемый платформой тестирования, для сопоставления виджета, который мы нашли на втором этапе, с нашим ожидаемым виджетом, выбрав любой из сопоставителей. Некоторые из важных сопоставителей следующие.

    • findOneWidget - проверяет, найден ли единственный виджет.

expect(find.text('Hello'), findsOneWidget);
    • findNothing - проверяет, что виджеты не найдены

expect(find.text('Hello World'), findsNothing);
    • findWidgets - проверяет, найдено ли более одного виджета.

expect(find.text('Save'), findsWidgets);
    • findNWidgets - проверяет, найдено N количество виджетов.

expect(find.text('Save'), findsNWidgets(2));

Полный тестовый код выглядит следующим образом -

testWidgets('finds hello widget', (WidgetTester tester) async { 
   await tester.pumpWidget(MaterialApp( 
      home: Scaffold( 
         body: Text('Hello'), 
      ), 
   )); 
   expect(find.text('Hello'), findsOneWidget); 
});

Здесь мы визуализировали виджет MaterialApp с текстом Hello, используя текстовый виджет в его теле. Затем мы использовали find.text, чтобы найти виджет, а затем сопоставили его с помощью findOneWidget.

Рабочий пример

Давайте создадим простое приложение для флаттера и напишем тест виджета, чтобы лучше понять задействованные шаги и концепцию.

  • Создайте новое приложение flutter, flutter_test_app в студии Android.

  • Откройте widget_test.dart в тестовой папке. Он имеет образец кода тестирования, как показано ниже -

testWidgets('Counter increments smoke test', (WidgetTester tester) async {
   // Build our app and trigger a frame. 
   await tester.pumpWidget(MyApp()); 
   
   // Verify that our counter starts at 0. 
   expect(find.text('0'), findsOneWidget); 
   expect(find.text('1'), findsNothing); 
   
   // Tap the '+' icon and trigger a frame. 
   await tester.tap(find.byIcon(Icons.add)); 
   await tester.pump(); 
   
   // Verify that our counter has incremented. 
   expect(find.text('0'), findsNothing); 
   expect(find.text('1'), findsOneWidget); 
});
  • Здесь тестовый код выполняет следующие функции:

    • Визуализирует виджет MyApp с помощью tester.pumpWidget.

    • Гарантирует, что счетчик изначально равен нулю, используя сопоставители findOneWidget и findNothing.

    • Находит кнопку увеличения счетчика с помощью метода find.byIcon.

    • Нажимает на кнопку увеличения счетчика, используя метод tester.tap.

    • Обеспечивает увеличение счетчика с помощью сопоставителей findOneWidget и findNothing.

  • Давайте снова коснемся кнопки увеличения счетчика, а затем проверим, увеличился ли счетчик до двух.

await tester.tap(find.byIcon(Icons.add)); 
await tester.pump(); 

expect(find.text('2'), findsOneWidget);
  • Щелкните меню "Выполнить".

  • Щелкните тесты в опции widget_test.dart. Это запустит тест и сообщит результат в окне результатов.