Flutter自动化测试辅助插件fast_flutter_driver_tool的使用

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

Flutter自动化测试辅助插件fast_flutter_driver_tool的使用

快速Flutter Driver (Fast Flutter Driver)

Build codecov

插件 Pub
Command Line Tool pub package
UI Helper pub package

弃用警告 (Deprecation Warning)

Flutter Driver 测试正在被新的集成测试取代。我将继续支持此包,只要它可行,但建议开始使用集成测试

您可以在此处阅读更多关于新Flutter集成测试的优点和缺点。

Demo

工具包介绍 (Toolkit for running rapidly flutter driver tests on desktop/mobile)

此工具包简化了创建可以在不重启或重建应用程序的情况下批量运行的Flutter Driver测试。您可以通过这篇文章了解工具包的工作原理。

桌面测试的理由 (The reasoning for Desktop tests)

桌面构建在UI方面几乎与Android/iOS构建相同。在模拟器/仿真器上运行测试可能会很痛苦,在CI上可能会更糟。您的CI通常是docker化的Linux机器——在Linux上针对Linux Flutter应用程序运行flutter driver测试既快速又可靠。此工具允许您比在模拟器/仿真器上更快、更可靠地运行flutter driver测试。

对于需要Android/iOS插件的应用程序流程,仍然应该在模拟器/仿真器或真实设备上运行测试。

也在Android/iOS上运行 (Running also on Android/iOS)

虽然在桌面平台上运行测试可以发现大多数错误,但建议有时也在实际设备上运行测试。某些Dart中的错误(例如以无效方式实现泛型)可能会导致移动设备上的原生崩溃,但在桌面上正常工作。因此,在每次发布之前,在移动设备上运行fastdriver测试是明智的选择。

示例 (Example)

您可以构建并执行一个示例,该示例可以在任何桌面系统和Docker上运行。

使用方法 (Usage)

1. 添加dev依赖项

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. 创建Dart文件

创建一个Dart文件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; // 减慢动画速度,使测试更稳定
  enableFlutterDriverExtension(
    handler: (playload) async {
      await configureTest(
        TestConfiguration.fromJson(json.decode(playload ?? '{}')),
      );
      return '';
    },
  );

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

4. 创建测试文件

创建一个测试文件test_driver/main_test.dart

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 {
    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脚本

安装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_tool的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


当然,以下是一个关于如何使用 fast_flutter_driver_tool 插件进行 Flutter 自动化测试的示例代码。这个插件可以帮助你更高效地编写和执行 Flutter 的集成测试。

首先,确保你的 Flutter 项目中已经添加了 fast_flutter_driver_tool 依赖。你可以在 pubspec.yaml 文件中添加以下依赖项:

dev_dependencies:
  flutter_test:
    sdk: flutter
  fast_flutter_driver_tool: ^最新版本号

然后运行 flutter pub get 来获取依赖。

接下来,我们将编写一个示例的 Flutter 应用程序以及对应的集成测试代码,演示如何使用 fast_flutter_driver_tool

示例 Flutter 应用程序

首先,创建一个简单的 Flutter 应用程序,比如一个计数器应用。

// main.dart
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: CounterPage(),
    );
  }
}

class CounterPage extends StatefulWidget {
  @override
  _CounterPageState createState() => _CounterPageState();
}

class _CounterPageState extends State<CounterPage> {
  int _counter = 0;

  void _increment() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Counter App'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _increment,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

集成测试代码

接下来,我们编写集成测试代码,使用 fast_flutter_driver_tool 来辅助测试。

// test_driver/app_test.dart
import 'package:flutter_driver/flutter_driver.dart';
import 'package:test/test.dart';
import 'package:fast_flutter_driver_tool/fast_flutter_driver_tool.dart';

void main() {
  group('Counter App Tests', () {
    FlutterDriver driver;

    setUpAll(() async {
      driver = await FlutterDriver.connect();
    });

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

    test('increment counter', () async {
      // 使用 fast_flutter_driver_tool 提供的工具函数定位元素
      final counterTextFinder = find.byValueKey('counterText'); // 假设你在 Text 小部件上添加了 key: ValueKey('counterText')
      final fabFinder = find.byTooltip('Increment');

      // 使用 fast_flutter_driver_tool 提供的等待函数等待元素可见
      await waitUntilVisible(driver, counterTextFinder);
      await waitUntilVisible(driver, fabFinder);

      // 读取初始计数器值
      String counterText = await driver.getText(counterTextFinder);
      int initialCounter = int.parse(counterText);

      // 点击浮动按钮
      await driver.tap(fabFinder);
      await Future.delayed(Duration(seconds: 1)); // 等待状态更新

      // 读取新的计数器值
      counterText = await driver.getText(counterTextFinder);
      int newCounter = int.parse(counterText);

      expect(newCounter, equals(initialCounter + 1));
    });
  });
}

注意:由于 fast_flutter_driver_tool 并没有一个标准的 Flutter 包,所以上述代码中的 waitUntilVisible 和其他工具函数是假设存在的。实际上,这些功能可以通过 Flutter Driver API 的 waitFor 和其他方法来实现。例如,你可以使用 waitFor 方法结合 find.textfind.byValueKey 来等待元素可见。

如果你有一个具体的 fast_flutter_driver_tool 包,请参考其文档以获取准确的函数名称和使用方法。如果没有这样的包,你可以使用 Flutter Driver API 提供的标准方法来编写你的测试代码。

运行测试

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

flutter drive --target=test_driver/app_test.dart

这将启动你的 Flutter 应用程序并运行定义的集成测试。确保你的应用程序和测试代码已经正确设置,以便测试能够顺利运行。

回到顶部