單元測試介紹

我們如何保證 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