測試外掛
瞭解如何測試你的外掛包。
所有常見的 Flutter 測試型別同樣適用於外掛包,但由於外掛包含原生程式碼,它們通常還需要其他型別的測試來驗證其全部功能。
外掛測試型別
#如需檢視這些測試型別的示例,你可以透過外掛模板建立一個新外掛,並檢視指定目錄。
-
Dart 單元測試和元件(Widget)測試。這些測試允許你像測試普通 Dart 包一樣測試外掛的 Dart 部分。但是,外掛的原生程式碼不會被載入,因此對平臺通道(platform channels)的任何呼叫都需要在測試中進行模擬(Mock)。
檢視
test目錄以獲取示例。 -
Dart 整合測試。由於整合測試是在 Flutter 應用程式(示例應用)的環境中執行的,它們可以同時測試 Dart 和原生程式碼,以及兩者之間的互動。它們對於測試需要在瀏覽器中執行的 Web 實現程式碼也非常有用。
對於外掛而言,這通常是最重要的測試。但是,使用
integration_test的 Dart 整合測試無法與原生 UI 互動,例如原生對話方塊或平臺檢視的內容。如需支援原生元件互動,請考慮使用patrol。檢視
example/integration_test目錄以獲取示例。 -
原生單元測試。 就像 Dart 單元測試可以獨立測試外掛的 Dart 部分一樣,原生單元測試可以獨立測試原生部分。每個平臺都有自己的原生單元測試系統,測試程式碼的編寫語言與被測程式碼的原生語言相同。
如果你需要模擬外掛程式碼所包裝的 API(這在 Dart 整合測試中是不可能的),原生單元測試會非常有價值。
你可以為每個平臺設定和使用你熟悉的任何原生測試框架,但以下框架已在外掛模板中預先配置好:
Android: JUnit 測試位於
android/src/test/。iOS 和 macOS: XCTest 測試分別位於
example/ios/RunnerTests/和example/macos/RunnerTests/。這些位於 example 目錄中,而不是頂級包目錄中,因為它們是透過示例應用的工程執行的。Linux 和 Windows: GoogleTest 測試分別位於
linux/test/和windows/test/。
其他型別且目前未在模板中預先配置的是原生 UI 測試。在原生 UI 測試框架(如 Espresso 或 XCUITest)下執行你的應用程式,可以實現與原生 UI 和 Flutter UI 元素同時互動的測試,因此如果你的外掛無法在沒有原生 UI 互動的情況下進行測試,這會非常有用。
執行測試
#Dart 單元測試
#這些測試可以像其他任何 Flutter 單元測試一樣執行,既可以從你偏好的 Flutter IDE 中執行,也可以使用 flutter test 命令。
整合測試
#有關執行此類測試的資訊,請查閱整合測試文件。命令必須在 example 目錄下執行。
原生單元測試
#對於所有平臺,在執行單元測試之前,你至少需要構建一次示例應用程式,以確保所有特定於平臺的構建檔案都已建立。
Android JUnit
如果你已在 Android Studio 中將示例作為 Android 專案開啟,則可以使用 Android Studio 測試 UI 執行單元測試。
若要從命令列執行測試,請在 example/android 目錄中使用以下命令:
./gradlew testDebugUnitTest
iOS 和 macOS XCTest
如果你已在 Xcode 中開啟示例應用,則可以使用 Xcode 測試 UI 執行單元測試。
若要從命令列執行測試,請在 example/ios (針對 iOS) 或 example/macos (針對 macOS) 目錄中使用以下命令:
xcodebuild test -workspace Runner.xcworkspace -scheme Runner -configuration Debug
對於 iOS 測試,你可能需要先在 Xcode 中開啟 Runner.xcworkspace 來配置程式碼簽名。
Linux GoogleTest
若要從命令列執行測試,請在示例目錄中使用以下命令,並將 "my_plugin" 替換為你的外掛專案名稱:
build/linux/plugins/x64/debug/my_plugin/my_plugin_test
如果你是以 release 模式而非 debug 模式構建的示例應用,請將 "debug" 替換為 "release"。
Windows GoogleTest
如果你已在 Visual Studio 中開啟示例應用,則可以使用 Visual Studio 測試 UI 執行單元測試。
若要從命令列執行測試,請在示例目錄中使用以下命令,並將 "my_plugin" 替換為你的外掛專案名稱:
build/windows/plugins/my_plugin/Debug/my_plugin_test.exe
如果你是以 release 模式而非 debug 模式構建的示例應用,請將 "Debug" 替換為 "Release"。
應新增哪些測試型別
#針對 Flutter 專案的常規測試建議同樣適用於外掛。關於外掛測試的一些額外考慮:
-
由於只有整合測試才能測試 Dart 與原生語言之間的通訊,請嘗試為每個平臺通道呼叫至少編寫一個整合測試。
-
如果某些流程無法使用
integration_test包進行測試(例如,如果它們需要與原生 UI 互動或模擬裝置狀態),請考慮使用patrol包進行原生 UI 互動,或者透過以下方式為兩端編寫“端到端”測試:原生單元測試:設定必要的模擬(Mocks),然後使用合成呼叫(synthesized call)呼叫方法通道的入口點,並驗證方法響應。
Dart 單元測試:模擬平臺通道,然後呼叫外掛的公共 API 並驗證結果。