整合測試

此頁面說明如何使用 integration_test 套件執行整合測試。使用此套件撰寫的測試具有下列特性

  • flutter drive 指令相容,可於實體裝置或模擬器上執行測試。
  • 可以在 Firebase Test Lab 上執行,讓您在各種裝置上進行自動化測試。
  • flutter_test API 相容,讓您能以類似 小工具測試 的方式撰寫測試

概觀

單元測試、小工具測試和整合測試

Flutter 支援三種類型的測試。單元 測試驗證方法或類別的行為。小工具 測試驗證 Flutter 小工具的行為,而無需執行應用程式本身。整合測試(也稱為端對端測試或 GUI 測試)執行完整的應用程式。

主機和目標

在開發期間,你可能會在稱為主機電腦的桌上型電腦上撰寫程式碼,並在稱為目標裝置的手機、瀏覽器或桌上型應用程式上執行應用程式。(如果你使用的是網頁瀏覽器或桌上型應用程式,則主機電腦也是目標裝置。)

integration_test

使用 integration_test 套件撰寫的測試可以

  1. 直接在目標裝置上執行,讓你能夠使用 Firebase 測試實驗室在多個 Android 或 iOS 裝置上進行測試。
  2. 使用 flutter test integration_test 執行。
  3. 使用 flutter_test API,讓整合測試更像是撰寫小工具測試

從 flutter_driver 移轉

使用 flutter_driver 的現有專案可以透過遵循從 flutter_drive 移轉指南移轉到 integration_test

專案設定

integration_testflutter_test 新增到你的 pubspec.yaml 檔案

$ flutter pub add 'dev:flutter_test:{"sdk":"flutter"}'  'dev:integration_test:{"sdk":"flutter"}'
"flutter_test" is already in "dev_dependencies". Will try to update the constraint.
Resolving dependencies... 
  collection 1.17.2 (1.18.0 available)
+ file 6.1.4 (7.0.0 available)
+ flutter_driver 0.0.0 from sdk flutter
+ fuchsia_remote_debug_protocol 0.0.0 from sdk flutter
+ integration_test 0.0.0 from sdk flutter
  material_color_utilities 0.5.0 (0.8.0 available)
  meta 1.9.1 (1.10.0 available)
+ platform 3.1.0 (3.1.2 available)
+ process 4.2.4 (5.0.0 available)
  stack_trace 1.11.0 (1.11.1 available)
  stream_channel 2.1.1 (2.1.2 available)
+ sync_http 0.3.1
  test_api 0.6.0 (0.6.1 available)
+ vm_service 11.7.1 (11.10.0 available)
+ webdriver 3.0.2
Changed 9 dependencies!

在你的專案中,建立一個新的目錄 integration_test,其中包含一個新檔案 <name>_test.dart

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:how_to/main.dart';
import 'package:integration_test/integration_test.dart';

void main() {
  testWidgets('tap on the floating action button, verify counter',
      (tester) async {
    // Load app widget.
    await tester.pumpWidget(const MyApp());

    // Verify the counter starts at 0.
    expect(find.text('0'), findsOneWidget);

    // Finds the floating action button to tap on.
    final fab = find.byKey(const Key('increment'));

    // Emulate a tap on the floating action button.
    await tester.tap(fab);

    // Trigger a frame.
    await tester.pumpAndSettle();

    // Verify the counter increments by 1.
    expect(find.text('0'), findsNothing);
    expect(find.text('1'), findsOneWidget);
  });
}

如果你正在尋找更多範例,請查看 testing_app範例儲存庫。

目錄結構

lib/
  ...
integration_test/
  foo_test.dart
  bar_test.dart
test/
  # Other unit tests go here.

另請參閱

使用 flutter 指令執行

這些測試可以使用 flutter test 指令啟動,其中 <DEVICE_ID>:是 flutter devices 指令輸出中顯示的選用裝置 ID 或模式

$ flutter test integration_test/foo_test.dart -d <DEVICE_ID>

這會在 foo_test.dart 中執行測試。若要在預設裝置上執行此目錄中的所有測試,請執行

$ flutter test integration_test

在瀏覽器中執行

下載並安裝 ChromeDriver,並在 4444 埠上執行

$ chromedriver --port=4444

若要使用 flutter drive 執行測試,請建立一個包含新檔案 test_driver/integration_test.dart 的新目錄

import 'package:integration_test/integration_test_driver.dart';

Future<void> main() => integrationDriver();

然後在 integration_test/<name>_test.dart 檔案中加入 IntegrationTestWidgetsFlutterBinding.ensureInitialized()

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:how_to/main.dart';
import 'package:integration_test/integration_test.dart';

void main() {
  IntegrationTestWidgetsFlutterBinding.ensureInitialized(); // NEW

  testWidgets('tap on the floating action button, verify counter',
      (tester) async {
    // Load app widget.
    await tester.pumpWidget(const MyApp());

    // Verify the counter starts at 0.
    expect(find.text('0'), findsOneWidget);

    // Finds the floating action button to tap on.
    final fab = find.byKey(const Key('increment'));

    // Emulate a tap on the floating action button.
    await tester.tap(fab);

    // Trigger a frame.
    await tester.pumpAndSettle();

    // Verify the counter increments by 1.
    expect(find.text('0'), findsNothing);
    expect(find.text('1'), findsOneWidget);
  });
}

在個別程序中,執行 flutter_drive

$ flutter drive \
   --driver=test_driver/integration_test.dart \
   --target=integration_test/counter_test.dart \
   -d web-server

如需進一步了解,請參閱 使用網路執行 Flutter Driver 測試 wiki 頁面。

在 Firebase Test Lab 上進行測試

您可以將 Firebase Test Lab 與 Android 和 iOS 目標同時使用。

Android 設定

請按照自述檔中的 Android 裝置測試區段中的說明進行操作。

iOS 設定

請依照 README 中 iOS 裝置測試 區段的說明進行操作。

Test Lab 專案設定

前往 Firebase Console,如果您尚未擁有專案,請建立一個新專案。然後導覽至品質 > Test Lab

Firebase Test Lab Console

上傳 Android APK

使用 Gradle 建立 APK

$ pushd android
# flutter build generates files in android/ for building the app
flutter build apk
./gradlew app:assembleAndroidTest
./gradlew app:assembleDebug -Ptarget=integration_test/<name>_test.dart
$ popd

其中 <name>_test.dart 是在專案設定區段中建立的檔案。

將「debug」APK 從 <flutter_project_directory>/build/app/outputs/apk/debug 拖曳到網頁上的Android Robo 測試目標。這會啟動 Robo 測試,並允許您執行其他測試

Firebase Test Lab upload

按一下執行測試,選取Instrumentation 測試類型,然後拖曳下列兩個檔案

  • <flutter_project_directory>/build/app/outputs/apk/debug/<file>.apk
  • <flutter_project_directory>/build/app/outputs/apk/androidTest/debug/<file>.apk

Firebase Test Lab upload two APKs

如果發生錯誤,您可以選取紅色圖示來檢視輸出

Firebase Test Lab test results

從命令列上傳 Android APK

請參閱 README 中的 Firebase Test Lab 區段,以取得從命令列上傳 APK 的說明。

上傳 Xcode 測試

請參閱 Firebase TestLab iOS 說明,以取得有關如何將 .zip 檔案上傳至 Firebase Console 的 Firebase TestLab 區段的詳細資訊。

從命令列上傳 Xcode 測試

請參閱 README 中的 iOS 裝置測試 部分,了解如何從命令列上傳 .zip 檔案的說明。