【问题标题】:Flutter integration tests - multiple testsFlutter 集成测试 - 多个测试
【发布时间】:2021-07-22 07:18:41
【问题描述】:

所以我最近想在我的应用程序中添加一些集成测试,并遵循 flutter.dev 关于集成测试的官方指南。我设法运行了一个测试,所以我想添加另一个测试,这就是问题的开始。

我不知道如何在同一运行中添加另一个测试套件,所以类似于

测试 1:

  1. 点击按钮
  2. 检查计数器是否增加

测试2:

  1. 再次点击按钮
  2. 检查计数器是否再次增加
void main() {
  IntegrationTestWidgetsFlutterBinding.ensureInitialized();

  group('Integration test', () {
    testWidgets('test 1', (WidgetTester tester) async {
      app.main();
      await tester.pumpAndSettle();

      // doing stuff here works
    });
  });
}

这就是我现在的工作。我预计将 app.main() 调用移到 group 之前并简单地添加另一个 testWidgets 调用将起作用(类似于单元测试),但它没有:

void main() {
  IntegrationTestWidgetsFlutterBinding.ensureInitialized();
  // app.main(); <<--- moving here...
  group('Integration test', () {
    // app.main(); <<--- ... or here didn't help
    testWidgets('test 1', (WidgetTester tester) async {
      // do stuff
    });
    testWidgets('test 2', (WidgetTester tester) async {
      // how to add this? And do stuff with the same app session
    });
  });
}

编辑: 为了更好地说明我想要实现的目标。以下是我目前进行的一些颤振驱动程序测试。我只想迁移到 integration_test 包的新 api,而不会丢失名称“test 1”、“test 2”等

void main() {
  group("group name", () {
    FlutterDriver driver;
    setUpAll(() async {
      driver = await FlutterDriver.connect();
    });

    tearDownAll(() async {
      if (driver != null) {
        await driver.close();
      }
    });

    test('test 1', () async {
      // do stuff with the driver
    });
    test('test 2', () async {
      // do other stuff with the driver with the same seesion
    });
    test('test 3', () async {
      // etc
    });
  });
}

【问题讨论】:

    标签: flutter testing


    【解决方案1】:

    我假设您的 app.main() 正在启动实际的应用程序。无法在组开始时仅启动一次应用程序。您必须在testWidgets() 中启动应用程序。

    创建一个restartApp() 可能很有用,它可以在每个testWidgets() 的开头触发。这样您就可以从头开始新的测试。

    您应该将UniqueKey() 添加到应用根小部件。这个UniqueKey()需要在restartApp()之后重新生成。您的应用将识别正在更改的密钥,因此它将执行重新加载。

    testWidgets('test 1', (WidgetTester tester) async {
        restartApp();
        clickButton();
        // expect count incremented
      });
    
    testWidgets('test 2', (WidgetTester tester) async {
        restartApp();
        clickButton();
        // expect count incremented
        clickButton();
        // expect count incremented again
      });
    

    【讨论】:

    • 你是对的,app.main() 启动应用程序,就像它在文档中一样重启部分是一个好主意,但并没有真正让我到达我想要的位置:/问题是,假设您有一个想要测试的复杂流程。我希望能够将此流程划分为多个我可以命名的测试,例如:1. 将商品添加到购物车 2. 将第二件商品添加到购物车 3. 从购物车中删除第一个商品 4. 提交购物车 5. 期望购物车仅与第二项一起提交
    • 因此,我希望有 5 个像这样描述的测试用例,这样当某些事情失败时,我会确切地看到它在哪一步失败(而不仅仅是让整个流程失败)
    • 您正在对应用程序进行验收测试,因此整个流程需要在同一个 testWidgets() 中。您可以在流程的步骤之间插入多个期望,以确保一切都按预期进行。如果未满足要求并显示明确的错误消息,则预期将失败。
    • 我想从 flutter_driver 迁移到 integration_test 包是不可能的,而不会丢失命名每个测试给我的所有信息:((我编辑了这个问题来解释我想要实现的目标更好)
    • 您还可以将流程分成多个步骤,这样每个 testWidgets() 都可以测试整个流程的一小部分。但是您必须重复必要的步骤才能获得一个场景,例如,删除第一个项目。
    【解决方案2】:

    在第一次测试之后,我已经通过将主应用程序注入测试来成功运行后续测试用例,例如

    import 'package:my_app/main.dart' as app;
    
    testWidgets('Test 1', (WidgetTester tester) {
        app.main();
        await tester.pumpAndSettle();
    
        // Tests ...
    });
    
    testWidgets('Test 2', (WidgetTester tester) {
        await tester.pumpWidget(app.MyApp());
        await tester.pumpAndSettle();
    
        // Tests ...
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-18
      • 2019-07-05
      • 1970-01-01
      • 2021-05-19
      • 2022-10-31
      • 2022-08-12
      • 2022-11-29
      相关资源
      最近更新 更多