单元测试介绍

我们如何保证 app 在增加了新特性或者改变了现有功能之后还能正常工作呢?答案是写测试!

使用单元测试可轻松地验证单个函数、方法或类的行为。 test这个 package 提供了写单测的核心框架, flutter_test package 则提供了额外的功能来测试 widget。

本教程将会为大家演示 test package 的用法,内容如下:

  1. test 或者 flutter_test 加入依赖;

  2. 创建测试文件;

  3. 创建一个要测试的类;

  4. 为创建的类写一个测试;

  5. 整合多个测试到一个 group

  6. 执行测试。

关于 package 测试的更多内容,可移步至 test package 的文档

1. 添加测试依赖

如果 Dart package 没有依赖 Flutter,可以导入 test package。 Test package 提供了编写测试所需要的核心功能。当我们写的 package 需要被 web、服务端和 Flutter app 使用时,这是最佳的方式。

运行 flutter pub addtest 添加为依赖:

$ flutter pub add dev:test

2. 创建测试文件

本例中,我们会创建两个文件:counter.dartcounter_test.dart

counter.dart 文件包含一个位于 lib 文件夹的待测试类,而位于 test 文件夹的 counter_test.dart 文件将包含测试本身。

通常测试文件应位于放置在 Flutter 应用或包的根目录下的 test 文件夹。测试文件通常以 _test.dart 命名,这是 test runner 寻找测试文件的惯例。

创建完成后,文件目录结构如下:

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

3. 创建一个要测试的类

下一步,我们需要一个「单元」来测试。记住:「单元」是一个抽象的名称,它可以表示一个函数、方法或者类。本例中,我们会在 lib/counter.dart 文件中创建一个 Counter 类。它负责增加或减少一个从 0 开始的 value

class Counter {
  int value = 0;

  void increment() => value++;

  void decrement() => value--;
}

注意: 为了简化内容,本教程没有遵守「测试驱动开发」的写法。如果你擅长那种开发模式,当然可以选择用那种方式来写。

4. 为创建的类写一个测试

我们将在 counter_test.dart 文件中写第一个测试。使用顶级函数 test 来定义,可通过执行顶级函数 expect 来检查结果正确与否。这两个函数都来自 test 这个 package。

// 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

如果多个测试之间互相关联,可以使用 test 这个 package 提供的 group 函数将他们整合到一起。

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

void main() {
  group('Counter', () {
    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. 选择菜单 Run

    3. 点击选项 Run 'tests in counter_test.dart'

    4. 或者,也可以使用系统快捷键!

  • VSCode

    1. 打开文件 counter_test.dart

    2. 在菜单里选择 Run

    3. 点击选项 Start Debugging

    4. 或者,也可以使用系统快捷键!

在终端执行测试

我们也可以打开终端,在工程根目录输入以下命令来执行测试:

flutter test test/counter_test.dart

你可以执行下面的命令获得更多有关单元测试的帮助:

flutter test --help