前面提到的單元測試和組件測試用於檢查個別的類別、函式或組件。它們並不會檢查系列操作,也無法捕捉真實情境運行的效能。而「整合測試」主要用於驗證程式的系列行為是否符合預期。這種測試通常也稱為「端到端測試」。
Flutter SDK 中包含了 integration_test
套件。integration_test
是 Flutter 團隊開發的新一代整合測試框架。flutter_driver
也是官方開發的,但現在被視為較舊的解決方案。
為了讓我們對於整體有完整的了解,我們將進一步學習 integration_test
以及 Appium。讓我們後續在對於整合測試的選擇有更完整的概念。
integration_test
接著,讓我們來初步看看如何使用 integration_test
搭配 flutter drive
指令執行測試。看看 Firebase Test Lab 透過各種裝置和設定測試應用程式。
整合測試需要針對一個應用程式測試,這裡我們使用預設的計算器範例。
$ flutter create counter_demo
開啟專案至 lib/main.dart
,在 floatingActionButton
加入 Key
floatingActionButton: FloatingActionButton(
key: const ValueKey('increment_counter_button'), // <- 這裡
onPressed: _incrementCounter,
tooltip: 'Increment',
child: const Icon(Icons.add),
),
integration_test
$ flutter pub add 'dev:integration_test:{"sdk":"flutter"}'
之後建立 integration_test
目錄,並加入 app_test.dart
檔案
counter_app/
lib/
main.dart
integration_test/
app_test.dart
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:counter_demo/main.dart';
import 'package:integration_test/integration_test.dart';
void main() {
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
group('端對端測試', () {
testWidgets('點擊浮動按鈕,驗證計數器', (tester) async {
// 載入應用程式組件
await tester.pumpWidget(const MyApp());
// 驗證計數器初始值為 0
expect(find.text('0'), findsOneWidget);
// 找到浮動按鈕
final button = find.byKey(const ValueKey('increment_counter_button'));
// 模擬點擊浮動按鈕
await tester.tap(button);
// 觸發刷新一幀
await tester.pumpAndSettle();
// 驗證計數器增加 1
expect(find.text('1'), findsOneWidget);
});
});
}
要執行整合測試需要根據測試的平台或系統而有所差異。例如
例如在 macOS 中我們可以執行
$ flutter test integration_test/app_test.dart
如果是行動裝置應用的測試我們則需要先連線裝置。然後執行上面指令。網頁的話我們還需要安裝 ChromeDriver
$ npx @puppeteer/browsers install chromedriver@stable
$ mkdir test_driver
端對端測試(E2E Testing),這種測試是指從使用者角度對系統進行測試,也就「人工測試」的主要範圍。
雖然系列文章我們主要是探討 Flutter ,但這裡我們希望額外帶出更多知識。畢竟,我們選擇 Flutter 就是因為其跨平台解決方案的特點。下面是各主流平台和框架的 E2E 測試工具彙整:
而 Appium 為跨平台 E2E 自動化測試工具除了平台支援 iOS、Android、Windows、macOS、網頁、React Native、tvOS 等等,撰寫語言支援 Java、Python、JavaScript、C#、Ruby。
Appium 是開源工具,主要應用於 mobile app,也支援 Web、Desktop App、及 TV (像是 tvOS, Android TV) 使自動化更加容易
網頁領域中的爬蟲先驅 Selenium 主要應用在網頁爬蟲或自動化上,他們依照 W3C WebDriver Specification (https://w3c.github.io/webdriver/) 並在長期開發下產出穩定的 API 與工具。主流的瀏覽器也都包含了這個 Spec。Appium 則是以行動裝置應用程式為目標,他們在技術實現上也以 W3C WebDriver spec 為主。
不同裝置的技術實現不一樣,但像點擊事件在網頁與手機非常相似(但還是不一樣),因此 Spec 提供了共用的介面像是找尋元素(find element)或是與元素互動(tap, setValue)的方法,讓我們可以近乎達到寫一次的程式,應用在不同的平台。
const element = await driver.$('//*[@text="Foo"]');
await element.click();
console.log(await element.getText())
console.log(await driver.getPageSource())
這裡我們主要還是聚焦在 Flutter 官方的整合測試介紹,並提出一個可能可以更廣泛使用的解決方案。後續我們可以依據自己的需求,觀點選擇適合自己的解決方案。