單元測試介紹
我們如何保證 app 在增加了新屬性或者改變了現有功能之後還能正常工作呢?答案是寫測試!
使用單元測試可輕鬆地驗證單個函式、方法或類別的行為。
test這個 package 提供了寫單測的核心框架,
flutter_test package 則提供了額外的功能來測試 widget。
本教程將會為大家示範 test package 的用法,內容如下:
-
將
test或者flutter_test加入依賴; -
建立測試檔案;
-
建立一個要測試的類;
-
為建立的類寫一個測試;
-
整合多個測試到一個
group; -
執行測試。
關於 package 測試的更多內容,可移步至 test package 的文件。
1. 新增測試依賴
如果 Dart package 沒有依賴 Flutter,可以匯入 test package。
Test package 提供了編寫測試所需要的核心功能。當我們寫的 package 需要被 web、伺服器端和 Flutter app 使用時,這是最佳的方式。
執行 flutter pub add 將 test 新增為依賴:
$ flutter pub add dev:test
2. 建立測試檔案
本例中,我們會建立兩個檔案:counter.dart 和 counter_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
-
開啟檔案
counter_test.dart -
前往 Run > Run ‘tests in counter_test.dart’。你也可以用鍵盤快捷鍵執行測試。
-
-
VSCode
-
開啟檔案
counter_test.dart -
前往 Run > Start Debugging。你也可以用鍵盤快捷鍵執行測試。
-
在終端執行測試
你也可以開啟終端,在工程根目錄輸入以下指令來執行所有測試:
flutter test test/counter_test.dart
你可以執行以下指令執行所以放在指定 group 裡的測試:
flutter test --plain-name "Test start, increment, decrement"
該例子使用的是在 第 5 小節 建立的 group。
你可以執行下面的指令獲得更多有關單元測試的幫助:
flutter test --help