📜  flutter 测试

📅  最后修改于: 2021-01-02 05:33:08             🧑  作者: Mango

flutter 测试

测试是一项活动,用于验证和验证无错误且符合用户要求的软件或应用程序。它确保实际结果与预期结果相符。它还有助于在效率,可用性和准确性方面改进软件或应用程序。

为了确保应用程序的高质量,测试是应用程序开发生命周期中最重要的阶段之一。这是应用程序或软件开发中最消耗的阶段。

Flutter框架为应用程序的自动化测试提供了出色的支持。通常,自动测试分为三种类型以完全测试应用程序。它们如下:

  • 单元测试
  • 小部件测试
  • 整合测试

单元测试

这是测试应用程序或软件的最简单方法。它测试单个函数,方法或类。单元测试的目的是确保在各种条件下代码的正确性。通常,单元测试不会与用户输入交互,不会在屏幕上渲染,不会从磁盘读取或写入数据,并且默认情况下不会使用外部依赖项。当您使用外部依赖项时,它们会被Mockito之类的软件包嘲笑。

小部件测试

窗口小部件测试用于测试单个窗口小部件。该测试的目的是确保小部件的UI外观符合预期并与其他小部件交互。窗口小部件测试的过程类似于单元测试,但是比单元测试更全面。该测试涉及多个类,并且需要一个测试环境来查找更多错误。正在测试的窗口小部件可以接收并响应用户的操作和事件,并能够实例化子窗口小部件。

整合测试

集成测试涉及以上测试以及应用程序的外部组件。它验证整个应用程序或应用程序的大部分。集成测试的目的是确保所有小部件和服务都能按预期工作。它还可以用来验证应用程序的性能。通常,集成测试在真实的设备(例如Android模拟器或iOS模拟器)上运行。

下面给出了不同类型的测试之间的权衡:

Unit Testing Widget Testing Integration Testing
Confidence Low Higher Highest
Maintenance Cost LowHigher Highest
Dependencies Few More Most
Execution Speed Quick Quick Slow

我们知道,在Flutter中,一切都是小部件。因此,在这里,我们将详细讨论小部件测试。

小部件测试简介

在窗口小部件测试中,您需要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);

  @override
  Widget 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);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Testing Demo',
      home: Scaffold(
        appBar: AppBar(
          title: Text(title),
        ),
        body: Center(
          child: Text(message),
        ),
      ),
    );
  }
}

要执行测试,请转到“运行”菜单,然后选择“在widget_test.dart中测试”选项。它将运行测试,并在以下屏幕上显示结果: