Flutter测试动作执行插件test_actions的使用

Flutter测试动作执行插件test_actions的使用

标题

test_actions

内容

This plugin can be used to facilitate the integration test on a Flutter app, handles the tests at a “higher” level.

示例代码

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

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

  TestActions actions = TestActions();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      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: () {
          // 执行点击操作
          actions.setTester(TimerTest().tester);
          actions.performActionAt(0);
        },
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

使用说明

1 Getting Started

  • 在项目的 pubspec.yaml 文件中添加以下行:
    test_actions: ^1.0.0
    
  • 如果您从未使用过集成测试,请遵循官方指南创建必要的文件。
  • 导入插件:
    import 'package:test_actions/test_actions.dart';
    

2 Usage

  • 首先设置 TestActions,这是包含所有要执行的动作的类。 如果不希望为所有添加的动作设置测试器,则需要在 TestActions 类中设置测试器.

  • 测试器应该在 testWidgets 方法内部进行分配。

    TestActions actions = TestActions();
    actions.setTester(tester);
    
  • 目前有5种动作可以使用此插件执行:

    动作名称 效果 必需变量
    pump 执行 WidgetTester 的 pump 命令,次数由 {pumpTimes} 变量定义。 如果设置了 awaitDuration,则会用作 pump 命令的持续时间。
    pumpAndSettle 执行 WidgetTester 的 pumpAndSettle 命令。
    press 使用 Finder 执行 WidgetTester 的 tap 操作。 这个动作需要 finder 不为空
    futureAwait 等待一段时间。 这个动作需要 awaitDuration 不为空。
    customAction 执行自定义函数。 这个动作需要 customAction 函数不为空。
    drag 执行拖动操作。 这个动作需要 dragOffset 不为空。
    enterText 将文本输入到文本框或接受文本输入的控件中。 这个函数需要 enterText 不为空。
  • 自版本 1.0.0 起,您可以为 testActions 分配一个名称,以便更容易找到失败的动作。

  • 可以按顺序执行所有动作:

    await actions.performActions();
    
  • 或者只执行一个动作:

    await actions.performActionAt(0);
    
  • TestAction 并不需要在 TestActions 类中,你可以创建一个动作并单独执行。

    TestAction singleAction = TestAction(
      action: TestActionType.CustomAction,
      customAction: () {
        print('This is a custom action');
        expect(1 + 1, 2);
      }
    );
    singleAction.performAction();
    
  • 要执行单个 TestAction,可以添加动作索引和/或要调用的函数。

    TestActions actions = TestActions();
    actions.setTester(tester);
    actions.performActionAt(0);
    
  • 从 Flutter 2 开始,integration_test 插件已经集成到 SDK 中:

    dev_dependencies:
      integration_test:
        sdk: flutter
    
  • 请访问 GitHub 页面查看示例: GitHub

  • 当前支持的测试动作包括:

    • pump: 执行 WidgetTester 的 pump 命令,次数由 {pumpTimes} 变量定义。
    • pumpAndSettle: 执行 WidgetTester 的 pumpAndSettle 命令。
    • press: 使用 Finder 执行 WidgetTester 的 tap 操作。
    • futureAwait: 等待一段时间。
    • customAction: 执行自定义函数。
    • drag: 执行拖动操作。
    • enterText: 将文本输入到文本框或接受文本输入的控件中。
  • 从版本 1.0.0 起,您可以为 testActions 分配一个名称,以便更容易找到失败的动作。

  • 可以按顺序执行所有动作:

    await actions.performActions();
    
  • 或者只执行一个动作:

    await actions.performActionAt(0);
    
  • TestAction 并不需要在 TestActions 类中,你可以创建一个动作并单独执行。

    TestAction singleAction = TestAction(
      action: TestActionType.CustomAction,
      customAction: () {
        print('This is a custom action');
        expect(1 + 1, 2);
      }
    );
    singleAction.performAction();
    

更多关于Flutter测试动作执行插件test_actions的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用test_actions插件来进行测试动作执行的代码示例。test_actions插件通常用于模拟用户交互,如点击、滑动、输入文本等操作,以便于进行UI测试。

首先,确保你已经在pubspec.yaml文件中添加了test_actions依赖:

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

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

接下来,我们编写一个Flutter应用的简单示例,并为其编写集成测试,使用test_actions来模拟用户动作。

示例Flutter应用

main.dart文件:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Test Actions Demo'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              TextField(
                decoration: InputDecoration(labelText: 'Enter Text'),
                onChanged: (value) {},
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () {},
                child: Text('Submit'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

集成测试

创建一个新的测试文件,例如test_actions_demo_test.dart

import 'package:flutter_test/flutter_test.dart';
import 'package:test_actions/test_actions.dart';
import 'package:integration_test/integration_test.dart';
import 'package:flutter/material.dart';
import 'main.dart' as app;  // 导入你的主应用文件

void main() {
  IntegrationTestWidgetsFlutterBinding.ensureInitialized();

  testWidgets('test actions demo', (WidgetTester tester) async {
    // 启动应用
    app.main();
    await tester.pumpAndSettle();

    // 查找TextField并输入文本
    final textFieldFinder = find.byTooltip('Enter Text');
    await tester.enterText(textFieldFinder, 'Hello, Flutter!');

    // 查找并提交按钮并点击
    final buttonFinder = find.text('Submit');
    await tester.tap(buttonFinder);
    await tester.pumpAndSettle();

    // 使用test_actions插件模拟用户动作
    final actions = TestActions(tester);
    await actions.enterTextInTextField(findByTooltip('Enter Text'), 'Another Text');
    await actions.tap(findByText('Submit'));

    // 验证一些UI状态(例如文本字段中的值,这部分取决于你的应用逻辑)
    expect(find.text('Hello, Flutter!'), findsOneWidget);
    // 你可以根据应用的逻辑添加更多的验证
  });
}

注意:

  1. findByTooltipfindByTexttest_actions插件提供的便利方法,用于查找Widget。你需要根据你的实际Widget属性来修改这些查找条件。
  2. TestActions类提供了许多便捷方法来模拟用户动作,如enterTextInTextFieldtap
  3. 由于test_actions插件的具体API可能会有所变化,请参考其官方文档或源代码以获取最新的使用方法。

确保你的测试文件放在integration_test目录下,以便使用Flutter的集成测试功能。运行测试时,可以使用flutter drive命令。

这是一个基础的示例,展示了如何使用test_actions插件来模拟用户交互。根据你的具体需求,你可以进一步扩展和定制这些测试。

回到顶部