测试插件
所有 标准的 Flutter 测试类型 也适用于插件包,但由于插件包含原生代码,它们通常还需要其他类型的测试来测试其所有功能。
插件测试的类型
#要查看每种测试类型的示例,您可以 从插件模板创建新插件,并在指定的目录中查找。
Dart 单元测试 和 小部件测试。这些测试允许您像测试非插件包的 Dart 代码一样测试插件的 Dart 部分。但是,插件的原生代码不会被加载,因此对平台通道的任何调用都需要在测试中进行模拟。
有关示例,请参阅
test
目录。Dart 集成测试。由于集成测试在 Flutter 应用(示例应用)的上下文中运行,因此它们可以测试 Dart 和原生代码以及它们之间的交互。它们也适用于测试需要在浏览器中运行的 Web 实现代码。
这些通常是插件最重要的测试。但是,Dart 集成测试无法与原生 UI 交互,例如原生对话框或平台视图的内容。
有关示例,请参阅
example/integration_test
目录。原生单元测试。 就像 Dart 单元测试可以独立测试插件的 Dart 部分一样,原生单元测试也可以独立测试原生部分。每个平台都有自己的原生单元测试系统,并且测试是用与被测试代码相同的原生语言编写的。
如果您需要模拟插件代码包装的 API,而这在 Dart 集成测试中是不可能的,那么原生单元测试可能会特别有价值。
您可以设置并使用您熟悉的每个平台的任何原生测试框架,但插件模板中已配置以下内容:
Android:可以在
android/src/test/
中找到 JUnit 测试。iOS 和 macOS:可以在
example/ios/RunnerTests/
和example/macos/RunnerTests/
中分别找到 XCTest 测试。这些测试位于示例目录中,而不是顶层包目录中,因为它们是通过示例应用的工程运行的。Linux 和 Windows:分别可以在
linux/test/
和windows/test/
中找到 GoogleTest 测试。
模板中当前未预先配置的其他类型的测试是原生 UI 测试。在原生 UI 测试框架(如 Espresso 或 XCUITest)下运行您的应用,可以对同时与原生和 Flutter UI 元素进行交互的测试进行运行,因此如果您的插件在没有原生 UI 交互的情况下无法进行测试,可能会很有用。
运行测试
#Dart 单元测试
#这些测试可以像任何其他 Flutter 单元测试一样运行,无论是从您喜欢的 Flutter IDE 运行,还是使用 flutter test
命令运行。
集成测试
#有关运行此类测试的信息,请查看 集成测试文档。命令必须在 example
目录中运行。
原生单元测试
#对于所有平台,您都需要至少构建一次示例应用程序,然后才能运行单元测试,以确保已创建所有特定于平台的构建文件。
Android JUnit
如果以 Android 项目的形式在 Android Studio 中打开了示例,则可以使用 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 和原生语言之间的通信,因此请尝试为每个平台通道调用至少编写一个集成测试。
如果某些流程无法使用集成测试进行测试(例如,如果它们需要与原生 UI 交互或模拟设备状态),请考虑使用单元测试编写两种部分之间的“端到端”测试。
原生单元测试,用于设置必要的模拟,然后调用方法通道入口点,并使用合成调用来验证方法响应。
Dart 单元测试,用于模拟平台通道,然后调用插件的公共 API 并验证结果。