📅  最后修改于: 2020-12-08 04:51:28             🧑  作者: Mango
测试是应用程序开发生命周期中非常重要的阶段。它确保了应用程序的高质量。测试需要仔细的计划和执行。这也是开发中最耗时的阶段。
Dart语言和Flutter框架为应用程序的自动化测试提供了广泛的支持。
通常,可以使用三种类型的测试过程来完全测试应用程序。它们如下-
单元测试是测试应用程序的最简单方法。它基于确保类的方法的一段代码(通常是一个函数)的正确性。但是,它不能反映实际环境,因此,它是查找错误的最少选择。
窗口小部件测试基于确保窗口小部件创建,渲染以及与其他窗口小部件按预期进行交互的正确性。它进一步迈进了一步,并提供了接近实时的环境来查找更多错误。
集成测试涉及单元测试和窗口小部件测试,以及应用程序的外部组件(如数据库,Web服务等),它模拟或模拟实际环境以查找几乎所有错误,但这是最复杂的过程。
Flutter为所有类型的测试提供支持。它为Widget测试提供广泛且排他的支持。在本章中,我们将详细讨论小部件测试。
Flutter测试框架提供了testWidgets方法来测试窗口小部件。它接受两个参数-
testWidgets('test description: find a widget', '');
小部件测试涉及三个不同的步骤-
在测试环境中渲染小部件。
WidgetTester是Flutter测试框架提供的用于构建和呈现窗口小部件的类。 WidgetTester类的pumpWidget方法接受任何窗口小部件并将其呈现在测试环境中。
testWidgets('finds a specific instance', (WidgetTester tester) async {
await tester.pumpWidget(MaterialApp(
home: Scaffold(
body: Text('Hello'),
),
));
});
找到我们需要测试的小部件。
Flutter框架提供了许多选项来查找在测试环境中呈现的小部件,它们通常被称为Finders。最常用的查找器是find.text,find.byKey和find.byWidget。
find.text查找包含指定文本的小部件。
find.text('Hello')
find.byKey通过其特定键查找小部件。
find.byKey('home')
find.byWidget通过其实例变量查找小部件。
find.byWidget(homeWidget)
确保小部件按预期工作。
Flutter框架提供了许多选项来使小部件与期望的小部件匹配,它们通常被称为Matchers 。我们可以使用测试框架提供的Expected方法来匹配小部件,通过选择任何匹配器,在第二步中将其与我们的期望小部件相匹配。一些重要的匹配器如下。
findsOneWidget-验证是否找到了一个小部件。
expect(find.text('Hello'), findsOneWidget);
findsNothing-验证未找到任何小部件
expect(find.text('Hello World'), findsNothing);
findsWidgets-验证不只找到一个小部件。
expect(find.text('Save'), findsWidgets);
findsNWidgets-验证是否找到了N个小部件。
expect(find.text('Save'), findsNWidgets(2));
完整的测试代码如下-
testWidgets('finds hello widget', (WidgetTester tester) async {
await tester.pumpWidget(MaterialApp(
home: Scaffold(
body: Text('Hello'),
),
));
expect(find.text('Hello'), findsOneWidget);
});
在这里,我们使用其主体中的Text小部件渲染了一个带有文本Hello的MaterialApp小部件。然后,我们使用find.text查找小部件,然后使用findsOneWidget对其进行匹配。
让我们创建一个简单的flutter应用程序并编写一个小部件测试,以更好地理解所涉及的步骤和概念。
在Android Studio中创建一个新的flutter应用程序flutter_test_app。
在测试文件夹中打开widget_test.dart。它具有以下示例测试代码-
testWidgets('Counter increments smoke test', (WidgetTester tester) async {
// Build our app and trigger a frame.
await tester.pumpWidget(MyApp());
// Verify that our counter starts at 0.
expect(find.text('0'), findsOneWidget);
expect(find.text('1'), findsNothing);
// Tap the '+' icon and trigger a frame.
await tester.tap(find.byIcon(Icons.add));
await tester.pump();
// Verify that our counter has incremented.
expect(find.text('0'), findsNothing);
expect(find.text('1'), findsOneWidget);
});
在这里,测试代码具有以下功能-
使用tester.pumpWidget渲染MyApp小部件。
使用findsOneWidget和findsNothing匹配器确保计数器最初为零。
使用find.byIcon方法查找计数器增量按钮。
使用tester.tap方法点击计数器增量按钮。
确保使用findsOneWidget和findsNothing匹配器增加计数器。
让我们再次点击计数器增加按钮,然后检查计数器是否增加到2。
await tester.tap(find.byIcon(Icons.add));
await tester.pump();
expect(find.text('2'), findsOneWidget);
点击运行菜单。
单击widget_test.dart选项中的测试。这将运行测试并在结果窗口中报告结果。