测试 Flutter 应用
了解不同类型的测试以及如何编写它们。
应用功能越多,手动测试就越困难。自动化测试有助于在发布前确保应用表现正确,同时保持功能开发与 bug 修复的速度。
自动化测试可分为以下几类:
A unit test tests a single function, method, or class.
-
A widget test (in other UI frameworks referred to as component test) tests a single widget.
-
An integration test tests a complete app or a large part of an app.
单元测试(unit test)测试单个函数、方法或类。
-
widget 测试(widget test,在其他 UI 框架中称为 component test)测试单个 widget。
-
集成测试(integration test)测试完整应用或应用的大部分。
一般而言,经过充分测试的应用会有大量由 代码覆盖率 跟踪的单元测试和 widget 测试,再加上足以覆盖所有重要用例的集成测试。此建议基于不同测试类型之间存在权衡,如下所示。
| Tradeoff | Unit | Widget | Integration |
|---|---|---|---|
| Confidence | Low | Higher | Highest |
| Maintenance cost | Low | Higher | Highest |
| Dependencies | Few | More | Most |
| Execution speed | Quick | Quick | Slow |
| 权衡 | 单元测试 | Widget 测试 | 集成测试 |
|---|---|---|---|
| 置信度 | 低 | 较高 | 最高 |
| 维护成本 | 低 | 较高 | 最高 |
| 依赖 | 少 | 较多 | 最多 |
| 执行速度 | 快 | 快 | 慢 |
单元测试
#
单元测试(unit test)测试单个函数、方法或类。单元测试的目标是在多种条件下验证逻辑单元的正确性。被测单元的外部依赖通常会
mock 掉。单元测试通常不会从磁盘读写、渲染到屏幕,或从运行测试的进程之外接收用户操作。有关单元测试的更多信息,你可以查看以下食谱,或在终端中运行 flutter test --help。
食谱
#Widget 测试
#widget 测试(widget test,在其他 UI 框架中称为 component test)测试单个 widget。widget 测试的目标是验证 widget 的 UI 外观与交互符合预期。测试 widget 涉及多个类,并需要能提供适当 widget 生命周期上下文的测试环境。
例如,被测 Widget 应能接收并响应用户操作与事件、执行布局并实例化子 widget。因此 widget 测试比单元测试更全面。不过与单元测试类似,widget 测试的环境会被替换为比完整 UI 系统简单得多的实现。
食谱
#集成测试
#集成测试(integration test)测试完整应用或应用的大部分。集成测试的目标是验证所有被测 widget 与服务能按预期协同工作。此外,你还可以使用集成测试验证应用性能。
一般而言,_集成测试_在真机或操作系统模拟器上运行,例如 iOS Simulator 或 Android Emulator。被测应用通常与测试驱动代码隔离,以避免结果偏差。
Flutter SDK 包含 integration_test
包。不过该包无法与原生平台 UI 交互,例如权限对话框、通知或 platform view。对于需要原生交互的应用,你可以使用
patrol 包,这是一个扩展开源框架,在原生平台支持下扩展 Flutter 的测试能力。
有关如何编写集成测试的更多信息,请参阅集成测试页面。
食谱
#持续集成服务
#持续集成(CI)服务允许你在推送新代码变更时自动运行测试。这能及时反馈代码变更是否按预期工作且未引入 bug。
有关在各种持续集成服务上运行测试的信息,请参阅以下内容:
除非另有说明,本文档之所提及适用于 Flutter 3.44.0 版本。本页面最后更新时间:2026-06-04。查看文档源码 或者 为本页面内容提出建议。