測試插件
所有Flutter 常見的測試類型同樣適用於插件套件,但由於插件包含原生程式碼,因此通常還需要其他類型的測試來驗證其所有功能。
插件測試的類型
#若想查看每種測試類型的範例,你可以使用插件範本建立新插件,並在指定的目錄中查看。
Dart 單元測試與元件測試。 這些測試讓你可以像測試非插件套件的 Dart 程式碼一樣,測試插件中的 Dart 部分。 不過,插件的原生程式碼不會被載入, 所以所有對平台通道(platform channels)的呼叫都需要在測試中進行模擬(mock)。
範例請參考
test目錄。Dart 整合測試。 由於整合測試會在 Flutter 應用程式(範例 app)的環境下執行, 因此可以同時測試 Dart 與原生程式碼,以及它們之間的互動。 此外,對於需要在瀏覽器中執行的 web 實作程式碼,整合測試也很適合用來做單元測試。
這類測試通常是插件最重要的測試。 不過,Dart 整合測試無法與原生 UI 互動, 例如原生對話框或平台視圖(platform views)的內容。
範例請參考
example/integration_test目錄。原生單元測試 就像 Dart 單元測試可以獨立測試插件的 Dart 部分一樣,原生單元測試可以獨立測試原生部分。 每個平台都有自己的原生單元測試系統,測試會以與被測試程式碼相同的原生語言撰寫。
如果你需要模擬(mock)被插件程式碼包裝的 API,而這在 Dart 整合測試中無法做到,原生單元測試會特別有價值。
你可以依照自己熟悉的平台,設定並使用任何原生測試框架, 不過以下這些已經在插件範本中預先設定好:
Android: JUnit 測試可在
android/src/test/找到。iOS 與 macOS: XCTest 測試分別可在
example/ios/RunnerTests/與example/macos/RunnerTests/找到。 這些測試位於 example 目錄下, 而非套件的頂層目錄, 因為它們是透過範例 app 的專案執行。Linux 與 Windows: GoogleTest 測試分別可在
linux/test/與windows/test/找到。
其他類型的測試,目前尚未在範本中預先設定的是原生 UI 測試。 在原生 UI 測試框架(如 Espresso 或 XCUITest)下執行你的應用程式, 可以讓測試同時與原生及 Flutter UI 元件互動, 因此如果你的插件必須透過原生 UI 互動才能測試,這類測試會很有幫助。
執行測試
#Dart 單元測試
#這些測試可以像其他 Flutter 單元測試一樣執行, 你可以在偏好的 Flutter IDE 中執行, 或使用 flutter test。
整合測試
#關於執行這類測試的資訊,請參考 整合測試文件。 指令必須在 example 目錄下執行。
原生單元測試
#所有平台都需要先至少編譯一次範例應用程式, 以確保所有平台專屬的建置檔案都已建立, 才能執行單元測試。
Android JUnit
如果你已經在 Android Studio 中以 Android 專案開啟範例, 可以使用 Android Studio 測試 UI 執行單元測試。
若要在命令列執行測試, 請在 example/android 目錄下使用以下指令:
./gradlew testDebugUnitTestiOS 與 macOS XCTest
如果你已在 Xcode 中開啟範例應用程式, 可以使用 Xcode Test UI 來執行單元測試。
若要從命令列執行測試, 請在 example/ios(iOS)或 example/macos(macOS)目錄下使用以下指令:
xcodebuild test -workspace Runner.xcworkspace -scheme Runner -configuration Debug對於 iOS 測試,你可能需要先在 Xcode 中開啟 Runner.xcworkspace 以設定程式碼簽署(code signing)。
Linux GoogleTest
若要從命令列介面(Command Line Interface)執行測試,請在範例目錄下使用以下指令,並將 "my_plugin" 替換為你的外掛專案名稱:
build/linux/plugins/x64/debug/my_plugin/my_plugin_test如果你是以 release 模式而非 debug 模式建置範例應用程式,請將「debug」替換為「release」。
Windows GoogleTest
如果你已在 Visual Studio 中開啟範例應用程式,可以使用 Visual Studio test UI 來執行單元測試。
若要從命令列執行測試,請在範例目錄下使用以下指令,並將「my_plugin」替換為你的外掛專案名稱:
build/windows/plugins/my_plugin/Debug/my_plugin_test.exe如果你是以 release 模式(而非 debug 模式)建置範例應用程式,請將 "Debug" 替換為 "Release"。
應該新增哪些類型的測試
#測試 Flutter 專案的一般建議 同樣適用於插件(plugin)。 針對插件測試,還有以下額外考量:
由於只有整合測試(integration tests)能測試 Dart 與原生語言間的通訊, 請盡量為每個平台通道(platform channel)呼叫至少撰寫一個整合測試。
如果有些流程無法透過整合測試來驗證——例如需要與原生 UI 互動或模擬裝置狀態時—— 可以考慮分別針對兩個部分撰寫「端到端」(end to end)單元測試(unit tests):
原生端的單元測試:建立所需的 mock,然後以合成呼叫(synthesized call)呼叫 method channel 的進入點,並驗證方法回應。
Dart 端的單元測試:mock 平台通道(platform channel),然後呼叫插件的公開 API,並驗證結果。