跳到主内容

测试插件

了解如何测试你的插件包。

所有常见的 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/

    • iOSmacOS: XCTest 测试分别位于 example/ios/RunnerTests/example/macos/RunnerTests/。这些位于 example 目录中,而不是顶级包目录中,因为它们是通过示例应用的工程运行的。

    • LinuxWindows: GoogleTest 测试分别位于 linux/test/windows/test/

其他类型且目前未在模板中预先配置的是原生 UI 测试。在原生 UI 测试框架(如 EspressoXCUITest)下运行你的应用程序,可以实现与原生 UI 和 Flutter UI 元素同时交互的测试,因此如果你的插件无法在没有原生 UI 交互的情况下进行测试,这会非常有用。

运行测试

#

Dart 单元测试

#

这些测试可以像其他任何 Flutter 单元测试一样运行,既可以从你偏好的 Flutter IDE 中运行,也可以使用 flutter test 命令。

集成测试

#

有关运行此类测试的信息,请查阅集成测试文档。命令必须在 example 目录下运行。

原生单元测试

#

对于所有平台,在运行单元测试之前,你至少需要构建一次示例应用程序,以确保所有特定于平台的构建文件都已创建。

Android JUnit

如果你已在 Android Studio 中将示例作为 Android 项目打开,则可以使用 Android Studio 测试 UI 运行单元测试。

若要从命令行运行测试,请在 example/android 目录中使用以下命令:

sh
./gradlew testDebugUnitTest

iOS 和 macOS XCTest

如果你已在 Xcode 中打开示例应用,则可以使用 Xcode 测试 UI 运行单元测试。

若要从命令行运行测试,请在 example/ios (针对 iOS) 或 example/macos (针对 macOS) 目录中使用以下命令:

sh
xcodebuild test -workspace Runner.xcworkspace -scheme Runner -configuration Debug

对于 iOS 测试,你可能需要先在 Xcode 中打开 Runner.xcworkspace 来配置代码签名。

Linux GoogleTest

若要从命令行运行测试,请在示例目录中使用以下命令,并将 "my_plugin" 替换为你的插件项目名称:

sh
build/linux/plugins/x64/debug/my_plugin/my_plugin_test

如果你是以 release 模式而非 debug 模式构建的示例应用,请将 "debug" 替换为 "release"。

Windows GoogleTest

如果你已在 Visual Studio 中打开示例应用,则可以使用 Visual Studio 测试 UI 运行单元测试。

若要从命令行运行测试,请在示例目录中使用以下命令,并将 "my_plugin" 替换为你的插件项目名称:

sh
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 并验证结果。