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

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

本篇文档只展示了 test 包所提供的核心特性。关于测试包的更多内容,可移步至 测试包文档.

使用步骤

  • 添加 testflutter_test 依赖

  • 创建一个测试文件

  • 创建一个要测试的类

  • 为创建的类写一个 test

  • 整合多个测试到一个 group

  • 执行测试

1. 添加测试依赖

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

  1. dev_dependencies:
  2. test: <latest_version>

2. 创建测试文件

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

In this example, create two files: counter.dart and counter_test.dart.

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

通常,测试文件应位于 test 文件夹下,并且这个文件夹要放在 Flutter 应用或包的根目录下。

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

  1. counter_app/
  2. lib/
  3. counter.dart
  4. test/
  5. counter_test.dart

3. 创建一个要测试的类

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

  1. class Counter {
  2. int value = 0;
  3. void increment() => value++;
  4. void decrement() => value--;
  5. }

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

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

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

  1. // Import the test package and Counter class
  2. import 'package:test/test.dart';
  3. import 'package:counter_app/counter.dart';
  4. void main() {
  5. test('Counter value should be incremented', () {
  6. final counter = Counter();
  7. counter.increment();
  8. expect(counter.value, 1);
  9. });
  10. }

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

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

  1. import 'package:test/test.dart';
  2. import 'package:counter_app/counter.dart';
  3. void main() {
  4. group('Counter', () {
  5. test('value should start at 0', () {
  6. expect(Counter().value, 0);
  7. });
  8. test('value should be incremented', () {
  9. final counter = Counter();
  10. counter.increment();
  11. expect(counter.value, 1);
  12. });
  13. test('value should be decremented', () {
  14. final counter = Counter();
  15. counter.decrement();
  16. expect(counter.value, -1);
  17. });
  18. });
  19. }

6. 执行测试

现在 Counter 类和它的测试都有了,开始执行测试!

用 IntelliJ 或 VSCode 执行测试

IntelliJ 和 VSCode 的 Flutter 插件支持执行测试。用这种方式执行测试是最好的,因为它可以提供最快的反馈闭环,而且还支持断点调试。

  • IntelliJ

  • IntelliJ

    • 打开文件 counter_test.dart

    • 选择菜单 Run

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

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

  • VSCode

  • VSCode

    • 打开文件 counter_test.dart

    • 选择菜单 Debug

    • 点击选项 Start Debugging

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

在终端执行测试

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

  1. flutter test test/counter_test.dart