Новый пакет integration_test просто показывает запуск теста [Android]

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

example_test.dart:

void main() {
  group('My-App', () {
    final binding = IntegrationTestWidgetsFlutterBinding.ensureInitialized() as IntegrationTestWidgetsFlutterBinding;

    testWidgets('Tap on SkipAuthentication', (tester) async {
      app.main();

      await binding.traceAction(() async {
        await tester.pumpAndSettle();

        await Future.delayed(Duration(seconds: 5));

        final fab = find.byKey(ValueKey(WidgetKeys.authenticationScreenKeys.skipAuthenticationButton));
        await tester.tap(fab);

        await tester.pumpAndSettle();
      });
    });



integration_driver.dart:

Future<void> main() async {
  integrationDriver();
}

Я понял, что если я не запустил tester. PumpWidget () покажет виджет, который я передаю методу, но это WidgetTest, а не тест интеграции.

Я предполагаю, что это связано с тем, что моя основная функция является асинхронной. Мне также нужен был этот обходной путь в моих старых тестах драйвера флаттера, чтобы дождаться первого Рамка. Но я не мог понять, как это реализовать с помощью нового пакета integration_test.

Надеюсь, ты сможешь мне помочь.


person Andreas B.    schedule 22.12.2020    source источник


Ответы (4)


Хм. Я начал конвертировать свои flutter_driver тесты в праздничные дни и наткнулся на то же самое.

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

    testWidgets("Main screen loads", (WidgetTester widgetTester) async {
      app.main();
      await sleep(Duration(seconds: 10));
      await widgetTester.pumpAndSettle();

      expect(find.text("What are you looking for?"), findsOneWidget);
    });
person Zalán Meggyesi    schedule 23.12.2020
comment
сделал то же самое, pumpAndSettle() имеет свойство Duration, поэтому вы должны использовать его поверх sleep() - person user3875913; 08.02.2021
comment
@ user3875913 не указывает ли здесь просто, как долго движок должен ждать, пока UI установится, самое большее? Так что, насколько я понимаю, на самом деле он не будет приостанавливать выполнение теста на такой долгий срок - у меня были некоторые проблемы с этим во время первых испытаний. - person Zalán Meggyesi; 09.02.2021
comment
по моему опыту, он делает то же самое, что и сон. Существует свойство тайм-аута, которое можно использовать максимум. - person user3875913; 10.02.2021
comment
попытался использовать свойство duration на pumpAndSettle() безуспешно, и в итоге использовал сон вот так ... Кстати, вы, ребята, нашли лучшее решение? - person thekucays; 14.06.2021

У меня тоже была эта проблема, и sleep / Future.delayed не работал. Иногда выполнялись интеграционные тесты, но в большинстве случаев этого не происходило.

В конечном итоге для меня проблема была решена путем изменения framePolicy из IntegrationTestWidgetsFlutterBinding на LiveTestWidgetsFlutterBindingFramePolicy.fullyLive. Вот полный пример:

void main() {
  final binding = IntegrationTestWidgetsFlutterBinding.ensureInitialized()
      as IntegrationTestWidgetsFlutterBinding;

  binding.framePolicy = LiveTestWidgetsFlutterBindingFramePolicy.fullyLive;

  testWidgets("failing test example", (WidgetTester tester) async {
    app.main();
    await tester.pumpAndSettle();

    // Start testing here...
  });
}

Решение было найдено в Google Codelabs.

person vkopio    schedule 23.06.2021

Я тоже боролся с этим несколько часов и наконец нашел ответ.

Ваша проблема в том, что не качаете виджет с await tester.pumpWidget(MyApp())

Ваш тест выглядит так:

void main() {
    testWidgets('Tap on SkipAuthentication', (tester) async {
      app.main(); // <--- You call app.main() - This Flutter Driver style, but not integration test style

      await binding.traceAction(() async {
        await tester.pumpAndSettle();

        await Future.delayed(Duration(seconds: 5));

        final fab = find.byKey(ValueKey(WidgetKeys.authenticationScreenKeys.skipAuthenticationButton));
        await tester.tap(fab);

        await tester.pumpAndSettle();
      });
    });

Вам нужно изменить свой тест следующим образом:

void main() {
  testWidgets('Tap on SkipAuthentication', (tester) async {
    await tester.pumpWidget(MyApp()); // You need to call await tester.pumpWidget();
    await tester.pump(const Duration(seconds: 1));

    final fab = find.byKey(ValueKey(WidgetKeys.authenticationScreenKeys.skipAuthenticationButton));
    await tester.tap(fab);

    await tester.pump();
  });
}
person Nils Reichardt    schedule 28.06.2021

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

Вот несколько вещей, которые я как бы извлек из всех своих попыток:

  • очевидно, что использование pumpAndSettle() с его аргументом Duration дает другие результаты, чем sleep(Duration) плюс pumpAndSettle() без продолжительности. Первый сработал для меня, чтобы получить первую страницу приложения, но не последний
  • вызов tester.pumpWidget(MyApp()) вместо app.main() на самом деле приводит к экрану ошибки для меня, мне определенно нужно использовать app.main()
  • настройка framePolicy необходима и в моем случае
  • Я думаю, что использование ValueKey или Key внутри find.byKey одно и то же: для меня оба они работают (давая им строку в качестве аргумента)

В конце концов, у меня работает следующий код:

void main() {
  final binding = IntegrationTestWidgetsFlutterBinding.ensureInitialized() 
    as IntegrationTestWidgetsFlutterBinding;
  binding.framePolicy = LiveTestWidgetsFlutterBindingFramePolicy.fullyLive;
    
  testWidgets('Tap on SkipAuthentication', (tester) async {
    app.main();
    await tester.pumpAndSettle(Duration(seconds: 3));

    final fab = find.byKey(ValueKey(WidgetKeys.authenticationScreenKeys.skipAuthenticationButton));
    await tester.tap(fab);

    await tester.pumpAndSettle();
  });
}
person Elisa    schedule 02.07.2021