Flutter自动化测试加速插件fast_flutter_driver的使用

发布于 1周前 作者 songsunli 来自 Flutter

Flutter自动化测试加速插件fast_flutter_driver的使用

简介

Fast Flutter Driver 是一个用于加速Flutter应用自动化测试的工具包。它简化了创建和运行批量Flutter Driver测试的过程,而无需重启或重新构建应用程序。该工具包可以在桌面、移动设备以及Docker环境中运行测试,提供了快速且可靠的测试体验。

重要提示

Flutter Driver测试正在被新的集成测试(Integration Tests)所取代。虽然Fast Flutter Driver仍然会继续得到支持,但建议您开始使用集成测试。您可以在这里阅读更多关于新集成测试的优点和缺点。

演示

使用场景

  • 桌面测试:桌面构建几乎与Android/iOS构建在UI方面完全相同。在模拟器/仿真器上运行测试可能会非常耗时,尤其是在CI环境中。由于CI通常是基于Linux的Docker容器,因此在Linux上运行flutter driver测试既快速又可靠。
  • 移动设备测试:尽管桌面测试可以发现大多数Bug,但某些Dart代码(如泛型实现不当)可能会导致移动设备上的原生崩溃,而在桌面上正常工作。因此,在每次发布前,建议在实际设备上运行fastdriver测试。

示例项目

您可以参考示例项目,该项目展示了如何在任何桌面系统和Docker中使用Fast Flutter Driver

使用步骤

1. 添加依赖

pubspec.yaml文件中添加fast_flutter_driver作为开发依赖:

dev_dependencies:
  fast_flutter_driver: ^2.0.0

2. 创建配置类

test_driver/generic/test_configuration.dart中创建一个配置类,用于定义测试的分辨率和平台:

import 'package:fast_flutter_driver/tool.dart';
import 'package:meta/meta.dart';

class TestConfiguration implements BaseConfiguration {
  const TestConfiguration({
    required this.resolution,
    this.platform,
  });

  factory TestConfiguration.fromJson(Map<String, dynamic> json) {
    return TestConfiguration(
      resolution: Resolution.fromJson(json['resolution']),
      platform: TestPlatformEx.fromString(json['platform']),
    );
  }

  @override
  final TestPlatform? platform;
  @override
  final Resolution resolution;

  @override
  Map<String, dynamic> toJson() {
    final p = platform;
    return <String, dynamic>{
      'resolution': resolution,
      if (p != null) 'platform': p.asString(),
    };
  }
}

3. 创建主入口文件

test_driver/generic/generic.dart中创建主入口文件,确保MyApplication是您的根应用小部件:

import 'dart:convert';
import 'package:fast_flutter_driver/driver.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_driver/driver_extension.dart';
import 'test_configuration.dart';

void main() {
  // 减慢动画速度以加快测试执行
  timeDilation = 0.1;
  
  // 启用Flutter Driver扩展
  enableFlutterDriverExtension(
    handler: (playload) async {
      await configureTest(
        TestConfiguration.fromJson(json.decode(playload ?? '{}')),
      );
      return '';
    },
  );

  runApp(
    RestartWidget<TestConfiguration>(
      builder: (_, config) => MyApplication(),
    ),
  );
}

4. 创建测试文件

test_driver/main_test.dart中创建一个测试文件,用于连接到Flutter Driver并执行测试:

import 'dart:convert';
import 'package:fast_flutter_driver/tool.dart';
import 'package:flutter_driver/flutter_driver.dart';
import 'package:test/test.dart';
import 'generic/test_configuration.dart';

void main(List<String> args) {
  late FlutterDriver driver;
  final properties = TestProperties(args);

  setUpAll(() async {
    // 连接到Flutter应用
    driver = await FlutterDriver.connect(dartVmServiceUrl: properties.vmUrl);
  });

  tearDownAll(() async {
    // 关闭驱动程序
    await driver.close();
  });

  Future<void> restart() {
    return driver.requestData(
      json.encode(
        TestConfiguration(
          resolution: properties.resolution,
          platform: properties.platform,
        ),
      ),
    );
  }

  test('main application', () async {
    // 重启应用并等待特定的小部件出现
    await restart();
    await driver.waitFor(find.byType('MyApplication'));
  });
}

5. 安装命令行工具

安装fast_flutter_driver命令行工具:

pub global activate fast_flutter_driver_tool

6. 运行测试

使用以下命令运行测试:

fastdriver --dart-args "--no-sound-null-safety" --flutter-args "--no-sound-null-safety"

更多关于Flutter自动化测试加速插件fast_flutter_driver的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter自动化测试加速插件fast_flutter_driver的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中集成和使用fast_flutter_driver插件进行自动化测试加速的示例代码。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加fast_flutter_driver依赖。

dependencies:
  flutter:
    sdk: flutter
  fast_flutter_driver: ^x.y.z  # 请替换为最新版本号

dev_dependencies:
  flutter_test:
    sdk: flutter

确保你替换了^x.y.z为当前最新的版本号。

2. 安装依赖

运行以下命令来安装依赖:

flutter pub get

3. 配置测试环境

在你的Flutter项目中,创建或修改一个测试文件,例如test_driver/app_test.dart。这个文件将包含你的集成测试代码。

4. 编写测试代码

使用fast_flutter_driver进行加速测试,你需要先初始化它。以下是一个简单的示例:

// test_driver/app_test.dart

import 'package:flutter_driver/flutter_driver.dart';
import 'package:fast_flutter_driver/fast_flutter_driver.dart';
import 'package:test/test.dart';

void main() {
  group('fast_flutter_driver example', () {
    FlutterDriver driver;

    // 设置超时时间
    final Duration timeout = Duration(seconds: 10);

    setUpAll(() async {
      // 初始化FastFlutterDriver
      driver = await FastFlutterDriver.connectToApp();
      // 可以选择性地设置全局加速配置
      await driver.setAcceleration(FastFlutterDriverAcceleration.fastMotion);
    });

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

    test('finds text', () async {
      // 查找并验证文本
      SerializableFinder helloFinder = find.text('Hello, World!');
      expect(await driver.waitFor(helloFinder), isTrue);
    });

    test('taps on button', () async {
      // 查找并点击按钮
      SerializableFinder buttonFinder = find.byTooltip('Tap me');
      await driver.tap(buttonFinder);

      // 验证点击后的结果
      SerializableFinder resultFinder = find.text('Button tapped!');
      expect(await driver.waitFor(resultFinder), isTrue);
    });
  });
}

5. 运行测试

使用以下命令运行你的集成测试:

flutter drive --target=test_driver/app_test.dart

注意事项

  1. 加速模式fast_flutter_driver 提供了不同的加速模式,如fastMotiontimeScale等,你可以根据需求选择适合的模式。
  2. 兼容性:确保你的Flutter版本与fast_flutter_driver插件兼容。
  3. 调试:在加速模式下,某些动画或交互可能看起来不自然,但在调试时你可以关闭加速来确保功能正常。

通过上述步骤,你可以在Flutter项目中集成并使用fast_flutter_driver插件来加速自动化测试。

回到顶部