Flutter - 测试



测试是应用程序开发生命周期中非常重要的阶段。它确保应用程序具有高质量。测试需要仔细的计划和执行。它也是开发中最耗时的阶段。

Dart语言和Flutter框架为应用程序的自动化测试提供了广泛的支持。

测试类型

通常,有三种类型的测试过程可用于完整测试应用程序。它们如下:

单元测试

单元测试是测试应用程序最简单的方法。它基于确保一段代码(通常是函数)或类的方法的正确性。但是,它不反映真实环境,因此是查找错误的选择最少的方法。

组件测试

组件测试基于确保小部件的创建、呈现和与其他小部件的交互按预期进行。它更进一步,提供接近实时环境以查找更多错误。

集成测试

集成测试包括单元测试和组件测试以及应用程序的外部组件,如数据库、Web服务等。它模拟或模拟真实环境以查找几乎所有错误,但它是最复杂的过程。

Flutter支持所有类型的测试。它为组件测试提供了广泛和独有的支持。在本章中,我们将详细讨论组件测试。

组件测试

Flutter测试框架提供testWidgets方法来测试小部件。它接受两个参数:

  • 测试描述
  • 测试代码
testWidgets('test description: find a widget', '<test code>');

涉及的步骤

组件测试涉及三个不同的步骤:

  • 在测试环境中渲染小部件。

  • WidgetTester是Flutter测试框架提供的用于构建和渲染小部件的类。WidgetTester类的pumpWidget方法接受任何小部件并在测试环境中渲染它。

testWidgets('finds a specific instance', (WidgetTester tester) async { 
   await tester.pumpWidget(MaterialApp( 
      home: Scaffold( 
         body: Text('Hello'), 
      ), 
   )); 
});
  • 查找我们需要测试的小部件。

    • Flutter框架提供了许多选项来查找在测试环境中渲染的小部件,它们通常称为查找器。最常用的查找器是find.text、find.byKey和find.byWidget。

      • find.text查找包含指定文本的小部件。

find.text('Hello')
      • find.byKey按其特定键查找小部件。

find.byKey('home')
      • find.byWidget按其实例变量查找小部件。

find.byWidget(homeWidget)
  • 确保小部件按预期工作。

  • Flutter框架提供了许多选项来将小部件与预期的小部件匹配,它们通常被称为*匹配器*。我们可以使用测试框架提供的expect方法来匹配我们在第二步中找到的小部件与我们选择任何匹配器预期的我们的预期小部件。

    • 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匹配器确保计数器已增加。

  • 让我们再次点击计数器递增按钮,然后检查计数器是否增加到二。

await tester.tap(find.byIcon(Icons.add)); 
await tester.pump(); 

expect(find.text('2'), findsOneWidget);
  • 点击运行菜单。

  • 点击widget_test.dart选项中的测试。这将运行测试并在结果窗口中报告结果。

Flutter Testing
广告