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. Это запустит тест и сообщит результат в окне результатов.