Как запускать интеграционные тесты в приложениях Flutter

Flutter, разработанный компанией Google, представляет собой бесплатный фреймворк с открытым исходным кодом для создания визуально привлекательных, нативно скомпилированных и многоплатформенных приложений из единой кодовой базы.

Flutter стал довольно популярным благодаря своей способности создавать многоплатформенные приложения. Он позволяет пользователям создавать, развертывать и тестировать веб-, мобильные, настольные и встроенные приложения из единой кодовой базы.

В этой статье мы рассмотрим, как запускать интеграционные тесты в приложениях Flutter.

Оглавление

  1. Введение во Flutter
  2. Особенности фреймворка Flutter
  3. Тестирование в приложениях Flutter
  4. Интеграционное тестирование в приложениях Flutter
  5. Миграция с драйвера Flutter
  6. Пакет Integration_Test
  7. Шаги для выполнения интеграционного тестирования в приложениях Flutter
  8. Интеграционные тесты в приложениях Flutter с помощью BrowserStack

Введение во Flutter

Flutter — это мобильный UI-фреймворк с открытым исходным кодом, который позволяет создавать приложения для Android и iOS (среди прочих платформ) из единой кодовой базы.

Как правило, фреймворки предлагают различные возможности для разработки мобильных приложений. Например, Android предоставляет фреймворк на основе Java и Kotlin для разработки мобильных приложений, в то время как iOS использует фреймворк на основе языка Objective-C или Swift.

В результате разработчикам приходилось использовать два разных языка и фреймворка для разработки приложений для обеих ОС. Естественно, кроссплатформенный фреймворк, такой как Flutter, упрощает им жизнь, экономя ресурсы, время и усилия.

Особенности фреймворка Flutter

  1. Способствует быстрой разработке
  2. Поддержка нескольких платформ
  3. Предоставляет современный и реактивный фреймворк
  4. Использует простой в освоении язык программирования Dart
  5. Жидкие и интуитивно понятные пользовательские интерфейсы
  6. Обширный каталог виджетов
  7. Один и тот же пользовательский интерфейс для нескольких платформ
  8. Стабильный и надежный

Тестирование в приложениях Flutter

Flutter поддерживает три типа тестов:

  1. Юнит-тест
  2. Тест виджета
  3. Интеграционный тест
  • Юнит-тест проверяет поведение метода или класса.
  • Виджет-тест проверяет поведение виджетов Flutter без необходимости запуска приложения.
  • Интеграционный тест (также называемый сквозным тестированием или тестированием GUI) запускает все приложение.

Интеграционное тестирование в приложениях Flutter

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

Интеграционные тесты во Flutter пишутся с помощью пакета интеграционных тестов, предоставляемого SDK. Это версия Selenium WebDriver (общий веб), Protractor (Angular), Espresso (Android) или Earl Gray (iOS) для Flutter. Пакет внутренне использует драйвер flutter для запуска теста на устройстве.

Тесты, написанные с помощью пакета integration_test, могут:

  1. Выполняться непосредственно на целевом устройстве, что позволяет проводить тесты на многочисленных устройствах Android или iOS.
  2. Запускаться с помощью flutter test integration_test.
  3. Использовать API flutter_test, что делает создание интеграционных тестов похожим на создание тестов виджетов.

Миграция с драйвера Flutter

Когда Flutter был представлен, интеграционные тесты были написаны с использованием flutter_driver, что позволило тестировщикам сохранить программный контроль над приложением Flutter. При выполнении команды futter drive инициируется 2 процесса:

  • Процесс «драйвера» на хост-машине (т.е. ноутбуке разработчика), который посылает инструкции приложению и получает данные от него.
  • Приложение настроено на идентификацию соединений, исходящих от процесса-драйвера.
    Это позволило разработчику написать тесты на обычном Dart, которые могли бы взаимодействовать с приложением. Однако это имело существенные недостатки:

  • Код драйвера не мог делиться кодом с приложением или модульными тестами. Фактически, он не мог использовать ни один пакет: зависимости flutter.

  • Он полагался на сильно типизированные API, поскольку не мог импортировать Key, Widget или MyCustomWidget. find.byType(‘EvnetsPage’) часто ошибался и читался неправильно.

Пакет Integration_Test

Пакет integration_test был выпущен для исправления некоторых проблем, упомянутых выше. Здесь код для тестов запускается в том же изоляторе, что и код самого приложения. Другими словами, он может обращаться к той же памяти. Это, по сути, решает предыдущие проблемы и предлагает несколько других преимуществ:

  1. Тот же API, что и у компонентных тестов.
  2. Возможность совместного использования кода с приложением.
  3. Внутреннее состояние приложения полностью видно тестам, а runApp вызывается внутри теста.
  4. Поскольку тесты встроены в исполняемый файл приложения, они могут запускаться на физических устройствах.

Шаги для выполнения интеграционного тестирования в приложениях Flutter

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

Чтобы выполнить интеграционный тест, выполните следующие шаги:

  1. Создайте приложение для тестирования.
  2. Добавьте зависимость integration_test.
  3. Создайте тестовые файлы.
  4. Напишите интеграционный тест.
  5. Запустите интеграционный тест.

Создание приложения для тестирования

Сначала создайте приложение для тестирования. В этом тесте будет использоваться приложение-счетчик, созданное командой flutter create. Это приложение позволит пользователю нажать на кнопку, чтобы увеличить счетчик.

import 'package:flutter/material.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {

  const MyApp({Key? key}) : super(key: key);

  @override

  Widget build(BuildContext context) {

    return const MaterialApp(

      title: 'Counter App',

      home: MyHomePage(title: 'Counter App Home Page'),

    );

  }

}

class MyHomePage extends StatefulWidget {

  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override

  _MyHomePageState createState() => _MyHomePageState();

}

class _MyHomePageState extends State<MyHomePage> {

  int _counter = 0;

  void _incrementCounter() {

    setState(() {

      _counter++;

    });

  }

  @override

  Widget build(BuildContext context) {

    return Scaffold(

      appBar: AppBar(

        title: Text(widget.title),

      ),

      body: Center(

        child: Column(

          mainAxisAlignment: MainAxisAlignment.center,

          children: <Widget>[

            const Text(

              'You have pushed the button this many times:',

            ),

            Text(

              '$_counter',

              // Provide a Key to this specific Text widget. This allows

              // identifying the widget from inside the test suite,

              // and reading the text.

              key: const Key('counter'),

              style: Theme.of(context).textTheme.headline4,

            ),

          ],

        ),

      ),

      floatingActionButton: FloatingActionButton(

        // Provide a Key to this button. This allows finding this

        // specific button inside the test suite, and tapping it.

        key: const Key('increment'),

        onPressed: _incrementCounter,

        tooltip: 'Increment',

        child: const Icon(Icons.add),

      ),

    );

  }

}
Вход в полноэкранный режим Выйти из полноэкранного режима

Источник

Добавьте зависимость integration_test

Теперь используйте пакеты integration_test, flutter_driver и **flutter_test ** для написания интеграционных тестов.

Добавьте эти зависимости в раздел dev_dependencies файла pubspec.yaml приложения. Местом расположения пакета должен быть Flutter SDK.

# pubspec.yaml

dev_dependencies:

  integration_test:

    sdk: flutter

  flutter_test:

    sdk: flutter
Вход в полноэкранный режим Выйдите из полноэкранного режима

Создайте файлы тестов

Создайте новый каталог integration_test с пустым файлом app_test.dart:

counter_app/

  lib/

    main.dart

  integration_test/

    app_test.dart
Войдите в полноэкранный режим Выйти из полноэкранного режима

Источник

Напишите интеграционный тест

Теперь напишите интеграционный тест, выполнив следующие шаги:

  1. Инициализируйте IntegrationTestWidgetsFlutterBinding, службу singleton, которая запускает тесты на физическом устройстве.
  2. Взаимодействуйте и тестируйте виджеты с помощью класса WidgetTester.
  3. Протестируйте необходимые сценарии.
import 'package:flutter_test/flutter_test.dart';

import 'package:integration_test/integration_test.dart';

import 'package:introduction/main.dart' as app;

void main() {

  IntegrationTestWidgetsFlutterBinding.ensureInitialized();

  group('end-to-end test', () {

    testWidgets('tap on the floating action button, verify counter',

        (WidgetTester tester) async {

      app.main();

      await tester.pumpAndSettle();

      // Verifies that the counter starts at 0.

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

      // Finds the floating action button to tap on.

      final Finder fab = find.byTooltip('Increment');

      // Emulates a tap on the floating action button.

      await tester.tap(fab);

      // Triggers a frame.

      await tester.pumpAndSettle();

      // Verifies if the counter increments by 1.

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

    });

  });

}
Войдите в полноэкранный режим Выход из полноэкранного режима

Источник

Запуск интеграционного теста

Процесс выполнения интеграционных тестов во многом зависит от используемой платформы. Если платформа позволяет, вы можете проводить тестирование на мобильных устройствах или в веб-браузерах.

  1. Мобильные устройства

Для тестирования на реальном устройстве iOS / Android сначала подключите устройство и выполните следующую команду из корня проекта:

flutter test integration_test/app_test.dart
Войти в полноэкранный режим Выйти из полноэкранного режима

Или укажите каталог для запуска всех интеграционных тестов:

flutter test integration_test
Войти в полноэкранный режим Выйти из полноэкранного режима

Эта команда запускает приложение и интеграционные тесты на целевом устройстве.

  1. Веб

Для тестирования на веб-браузере (в нашем примере — Chrome) загрузите ChromeDriver.

Затем создайте новый каталог test_driver, содержащий новый файл integration_test.dart:

import 'package:integration_test/integration_test_driver.dart';

Future<void> main() => integrationDriver();
Войдите в полноэкранный режим Выход из полноэкранного режима

Запустите, например, WebDriver:

chromedriver --port=4444
Войти в полноэкранный режим Выйти из полноэкранного режима

Из корня проекта выполните следующую команду:

flutter drive 

  --driver=test_driver/integration_test.dart 

  --target=integration_test/app_test.dart 

  -d web-server
Войти в полноэкранный режим Выйти из полноэкранного режима

Источник

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *