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
更多关于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);
// 你可以根据应用的逻辑添加更多的验证
});
}
注意:
findByTooltip
和findByText
是test_actions
插件提供的便利方法,用于查找Widget。你需要根据你的实际Widget属性来修改这些查找条件。TestActions
类提供了许多便捷方法来模拟用户动作,如enterTextInTextField
和tap
。- 由于
test_actions
插件的具体API可能会有所变化,请参考其官方文档或源代码以获取最新的使用方法。
确保你的测试文件放在integration_test
目录下,以便使用Flutter的集成测试功能。运行测试时,可以使用flutter drive
命令。
这是一个基础的示例,展示了如何使用test_actions
插件来模拟用户交互。根据你的具体需求,你可以进一步扩展和定制这些测试。