如何 运行 使用 flutter 进行多项测试 - 集成测试

How to run multiple tests with flutter - Integration Test

使用 flutter 测试和新的集成测试包没有找到任何可以帮助我的东西。

我的问题是我需要运行几个测试,但是当第一个测试结束或者第二个测试失败时,因为当测试结束时,应用程序不会立即重新启动。我的代码是这样的: 我不知道这是否是最好的方法。

void main() {
 (IntegrationTestWidgetsFlutterBinding.ensureInitialized()
  as IntegrationTestWidgetsFlutterBinding)
  .defaultTestTimeout = const Timeout(Duration(minutes: 2));

WelcomeTester welcomeTester;
LoginTester loginTester;

group('e2e integration test', () {
testWidgets('Test case 1',
        (WidgetTester tester) async {
  await app.main();
  await tester.pumpAndSettle(const Duration(seconds: 5));

  welcomeTester = WelcomeTester(tester);
  loginTester = LoginTester(tester);

  await welcomeTester.checkScreenOpenedByKey(WelcomeKeys.screenWelcomePage);
  await welcomeTester.findTitle();
  await welcomeTester.scrollThePage();
  await welcomeTester.tapButton(WelcomeKeys.btnHaveAccount);
  await welcomeTester.checkScreenOpenedByKey(LoginKeys.screenLoginPage);
  });

testWidgets('Test case 2',
        (WidgetTester tester) async {
  await tester.pumpAndSettle(const Duration(seconds: 5));

  welcomeTester = WelcomeTester(tester);

  await welcomeTester.checkScreenOpenedByKey(WelcomeKeys.screenWelcomePage);
  await welcomeTester.tapButton(WelcomeKeys.btnCreateAccount);
  await welcomeTester.checkScreenOpenedByKey(OnboardingKeys.screenTermsPage);
  });
 });
}

我的目标是在 app_test.dart 中创建几个测试组,并在每个组中创建几个 TestWidgets

每次应用更改时都需要使用它,让它有机会进行下一个操作。

      await tester.pumpAndSettle();

在进入下一个动作之前稳定到 UI。

文档:https://api.flutter.dev/flutter/flutter_test/WidgetTester/pumpAndSettle.html

我不确定我是否理解您的问题,但其中一种解决方案可能会有所帮助。

解决方案 1

根据您 运行 测试的位置,这可能不是一个有效的答案,但如果您在本地 运行 进行测试,您可以将测试分成 2 个不同的测试文件。

那么你可以运行

flutter drive --flavor=staging --target=integration_test/test_1.dart --driver=test_driver/app_test.dart
flutter drive --flavor=staging --target=integration_test/test_2.dart --driver=test_driver/app_test.dart

这将在每个测试文件 运行 后从设备上卸载并重新安装您的应用程序。

解决方案 2

您也可以像这样在拆解中删除应用用户数据

import 'dart:io';
import 'package:path_provider/path_provider.dart';
tearDown(() async {
    final filesDirPath = (await getApplicationSupportDirectory()).path;
    if (Directory(filesDirPath).existsSync()) {
      await Directory(filesDirPath).delete(recursive: true);
    }
});

这应该会使您的应用程序恢复到干净状态。 可能有更多目录要删除,例如 getTemporaryDirectory(),但这通常是保存用户数据的地方。