单元测试简介

如何确保您的应用程序在添加更多功能或更改现有功能时继续正常工作?通过编写测试。

单元测试对于验证单个函数、方法或类的行为非常有用。 test 包提供了编写单元测试的核心框架,而 flutter_test 包提供了用于测试小部件的额外实用程序。

此食谱演示了 test 包提供的核心功能,使用以下步骤

  1. 添加 testflutter_test 依赖项。
  2. 创建测试文件。
  3. 创建要测试的类。
  4. 为我们的类编写 test
  5. 将多个测试组合到 group 中。
  6. 运行测试。

有关测试包的更多信息,请参阅测试包文档

1. 添加测试依赖项

#

test 包提供了在 Dart 中编写测试的核心功能。这是为 Web、服务器和 Flutter 应用程序使用的包编写测试的最佳方法。

要将 test 包添加为开发依赖项,请运行 flutter pub add

flutter pub add dev:test

2. 创建测试文件

#

在本例中,创建两个文件:counter.dartcounter_test.dart

counter.dart 文件包含您要测试的类,位于 lib 文件夹中。counter_test.dart 文件包含测试本身,位于 test 文件夹中。

通常,测试文件应位于 Flutter 应用程序或包根目录下的 test 文件夹中。测试文件应始终以 _test.dart 结尾,这是测试运行器在搜索测试时使用的约定。

完成后,文件夹结构应如下所示

counter_app/
  lib/
    counter.dart
  test/
    counter_test.dart

3. 创建要测试的类

#

接下来,您需要一个要测试的“单元”。请记住:“单元”是函数、方法或类的另一种名称。在本例中,在 lib/counter.dart 文件中创建一个 Counter 类。它负责从 0 开始递增和递减 value

dart
class Counter {
  int value = 0;

  void increment() => value++;

  void decrement() => value--;
}

注意:为简单起见,本教程不遵循“测试驱动开发”方法。如果您更习惯于这种开发风格,您可以随时选择这种方式。

4. 为我们的类编写测试

#

counter_test.dart 文件中,编写第一个单元测试。测试使用顶层 test 函数定义,您可以使用顶层 expect 函数检查结果是否正确。这两个函数都来自 test 包。

dart
// Import the test package and Counter class
import 'package:counter_app/counter.dart';
import 'package:test/test.dart';

void main() {
  test('Counter value should be incremented', () {
    final counter = Counter();

    counter.increment();

    expect(counter.value, 1);
  });
}

5. 将多个测试组合到一个 group

#

如果您想运行一系列相关的测试,请使用 flutter_test 包的 group 函数对测试进行分类。一旦放入一个组中,您就可以使用一个命令对该组中的所有测试调用 flutter test

dart
import 'package:counter_app/counter.dart';
import 'package:test/test.dart';

void main() {
  group('Test start, increment, decrement', () {
    test('value should start at 0', () {
      expect(Counter().value, 0);
    });

    test('value should be incremented', () {
      final counter = Counter();

      counter.increment();

      expect(counter.value, 1);
    });

    test('value should be decremented', () {
      final counter = Counter();

      counter.decrement();

      expect(counter.value, -1);
    });
  });
}

6. 运行测试

#

现在您已经有了带有测试的 Counter 类,您可以运行测试。

使用 IntelliJ 或 VSCode 运行测试

#

IntelliJ 和 VSCode 的 Flutter 插件支持运行测试。这通常是在编写测试时最好的选择,因为它提供了最快的反馈循环以及设置断点的能力。

  • IntelliJ

    1. 打开 counter_test.dart 文件
    2. 转到 运行 > 运行 'counter_test.dart 中的测试'。您也可以按平台的相应键盘快捷键。
  • VSCode

    1. 打开 counter_test.dart 文件
    2. 转到 运行 > 开始调试。您也可以按平台的相应键盘快捷键。

在终端中运行测试

#

要从终端运行所有测试,请从项目的根目录运行以下命令

flutter test test/counter_test.dart

要运行您放入一个 group 中的所有测试,请从项目的根目录运行以下命令

flutter test --plain-name "Test start, increment, decrement"

此示例使用在 第 5 节 中创建的 group

要了解有关单元测试的更多信息,您可以执行以下命令

flutter test --help