测试是一项活动, 用于验证和验证无错误且符合用户要求的软件或应用程序。它确保实际结果与预期结果相符。它还有助于在效率, 可用性和准确性方面改进软件或应用程序。
为了确保应用程序的高质量, 测试是应用程序开发生命周期中最重要的阶段之一。这是应用程序或软件开发中最消耗的阶段。
Flutter框架为应用程序的自动化测试提供了出色的支持。通常, 自动测试分为三种类型以完全测试应用程序。它们如下:
- 单元测试
- 小部件测试
- 整合测试
文章图片
单元测试
这是测试应用程序或软件的最简单方法。它测试单个函数, 方法或类。单元测试的目的是确保在各种条件下代码的正确性。通常, 单元测试不会与用户输入交互, 在屏幕上渲染, 从磁盘读取或写入数据, 并且默认情况下不使用外部依赖项。当你使用外部依赖项时, 它们会被Mockito之类的软件包嘲笑。
小部件测试
窗口小部件测试用于测试单个窗口小部件。该测试的目的是确保小部件的UI外观符合预期并与其他小部件交互。窗口小部件测试的过程类似于单元测试, 但是比单元测试更全面。该测试涉及多个类, 并且需要一个测试环境来查找更多错误。正在测试的窗口小部件可以接收并响应用户的操作和事件, 并能够实例化子窗口小部件。
整合测试
集成测试涉及以上测试以及应用程序的外部组件。它验证整个应用程序或应用程序的大部分。集成测试的目的是确保所有小部件和服务都能按预期工作。它还可以用来验证应用程序的性能。通常, 集成测试在真实的设备(例如Android模拟器或iOS模拟器)上运行。
下面给出了不同类型的测试之间的权衡:
单元测试 | 小部件测试 | 整合测试 | |
---|---|---|---|
Confidence | Low | Higher | Highest |
Maintenance | Cost | 低高 | Highest |
Dependencies | Few | More | Most |
执行速度 | Quick | Quick | Slow |
小部件测试简介
在窗口小部件测试中, 你需要flutter_test软件包提供的一些其他工具。该软件包提供了以下工具来测试小部件。
- WidgetTester:它允许在测试环境中构建窗口小部件并与之交互。
- testWidgets():此方法为每个测试用例自动创建一个WidgetTester。它用作普通的test()函数。它接受两个参数:测试描述和测试代码。
- Finder类:用于在测试环境中搜索窗口小部件。
- Matcher类:它有助于验证Finder类是在测试环境中定位单个窗口小部件还是多个窗口小部件。
步骤1:添加flutter_test依赖项。
第一步, 我们需要在pubspec.yaml文件中添加flutter_test依赖项。默认情况下, 它已被添加到依赖项部分。
步骤2:创建要测试的小部件。
接下来, 我们必须创建一个小部件来执行测试。以下代码段创建了一个小部件, 其中包含要在屏幕上显示的标题和消息。
class MyAppWidget extends StatelessWidget {final String title;
final String message;
const MyWidget({Key key, @required this.title, @required this.message, }) : super(key: key);
@overrideWidget build(BuildContext context) {return MaterialApp(title: 'Flutter Testing Demo', home: Scaffold(appBar: AppBar(title: Text(title), ), body: Center(child: Text(message), ), ), );
}}
步骤3:创建一个testWidgets测试。
要测试小部件, 请使用testWidget()方法。这种方法允许我们定义一个测试并接受两个参数:测试描述和测试代码。它还创建了一个WidgetTester来与小部件一起使用。下面的代码验证MyAppWidget是否显示标题和消息。
void main() {testWidgets(' The widget contains a title and message', (WidgetTester tester) async {// Write test code here.});
}
步骤4:使用WidgetTester构建小部件。
WidgetTester提供了pumpWidget()方法来构建和呈现所提供的窗口小部件。它创建MyAppWidget实例, 分别显示“ Ti”和“ Msg”作为标题和消息。以下代码对其进行了更清晰的说明。
void main() {testWidgets(The widget contains a title and message', (WidgetTester tester) async {await tester.pumpWidget(MyWidget(title: 'Ti', message: 'Msg'));
});
}
步骤5:使用Finder搜索小部件。
在此步骤中, 我们将使用Finder类在小部件树中搜索标题和消息。它允许我们验证窗口小部件是否正确显示。为此, 我们需要使用find.text()方法。
void main() {testWidgets(The widget contains a title and message', (WidgetTester tester) async {await tester.pumpWidget(MyWidget(title: 'Ti', message: 'Msg'));
final titleFinder = find.text('Ti');
final messageFinder = find.text('Msg');
});
}
步骤6:使用Matcher验证小部件。
最后, 我们需要使用Matcher类来验证文本消息是否出现在屏幕上。它可以确保小部件在屏幕上仅出现一次。我们可以看下面的代码来理解它。
void main() {testWidgets(The widget contains a title and message', (WidgetTester tester) async {await tester.pumpWidget(MyWidget(title: 'Ti', message: 'Msg'));
final titleFinder = find.text('Ti');
final messageFinder = find.text('Msg');
expect(titleFinder, findsOneWidget);
expect(messageFinder, findsOneWidget);
});
}
现在, 我们将看到工作示例以了解小部件测试的概念。首先, 在Android Studio中创建一个项目, 然后导航到项目目录的test文件夹。现在, 打开widget_test.dart文件并替换以下代码:
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {testWidgets(The widget contains a title and message', (WidgetTester tester) async {// Create the widget by telling the tester to build it.await tester.pumpWidget(MyWidget(title: 'Ti', message: 'Msg'));
// Create the Finders.final titleFinder = find.text('Ti');
final messageFinder = find.text('Msg');
expect(titleFinder, findsOneWidget);
expect(messageFinder, findsOneWidget);
});
}class MyAppWidget extends StatelessWidget {final String title;
final String message;
const MyAppWidget({Key key, @required this.title, @required this.message, }) : super(key: key);
@overrideWidget build(BuildContext context) {return MaterialApp(title: 'Flutter Testing Demo', home: Scaffold(appBar: AppBar(title: Text(title), ), body: Center(child: Text(message), ), ), );
}}
【Flutter测试】要执行测试, 请转到“运行”菜单, 然后选择“在widget_test.dart中测试”选项。它将运行测试, 并在以下屏幕上显示结果:
文章图片
推荐阅读
- Flutter REST API介绍和使用
- Flutter数据库概念
- Flutter包package
- Flutter导航和路由
- Flutter创建特定于Android平台的代码
- Flutter动画
- Flutter列表
- Flutter抽屉drawer
- Flutter标签栏