单元测试介绍

我们如何保证 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 函数将他们整合到一起。你可以用 flutter test 运行同一个组的所有测试。

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. 前往 Run > Run ‘tests in counter_test.dart’。你也可以用键盘快捷键运行测试。

  • VSCode

    1. 打开文件 counter_test.dart

    2. 前往 Run > Start Debugging。你也可以用键盘快捷键运行测试。

在终端执行测试

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

flutter test test/counter_test.dart

你可以运行以下命令执行所以放在指定 group 里的测试:

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

该例子使用的是在 第 5 小节 创建的 group

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

flutter test --help