Flutter Testing 是一个面向 Flutter 项目的测试技能,用于设计、编写或审查单元测试、Widget 测试、Golden 测试和集成测试。其核心原则是:在能提供足够信心的最廉价层级上测试可观察行为。
一、测试层级选择 技能将测试分为四类,并说明各自适用范围:
- 单元测试:纯逻辑、状态转换、仓库(repositories)、解析和失败策略。
- Widget 测试:渲染、语义、交互、焦点、导航接线以及状态到 UI 的行为。
- Golden 测试:在平台与字体可控、比较有意义时,用于稳定的视觉契约。
- 集成测试:关键流程、插件集成、性能以及需要真实目标设备的行为。 技能明确要求:不要用实现细节(如私有方法调用或精确的 widget 树形状)替代行为断言。
二、可靠性 在确定性重要时,注入时钟、随机性、存储和传输层。优先使用小型伪造对象而非大型 mock 图,验证输出和副作用而非偶然调用。用测试框架控制异步进度,避免任意 sleep。应 pump 到已知状态或有界完成,而不是在动画或定时器持续存在时使用无界的 pumpAndSettle。为测试提供独立数据,并清理全局绑定、文件、数据库和订阅。只有在审查渲染差异后才更新 golden。
三、一次性测试探针 创建每个新测试前先分类。回归、验收和规格测试应作为普通项目文件保留;测试通过不是删除它的理由。对于不应提交的一次性诊断探针:
- 在运行器允许时,优先使用仓库之外的隔离临时项目或目录。
- 若探针必须位于 test/ 或 integration_test/ 下,选择一个明确唯一的路径,记录创建前它是否存在或被跟踪,拒绝覆盖,并将文件标记为生成且可丢弃。
- 路径创建后立即注册宿主侧清理,使其在成功或失败后都运行;清理前保留测试退出状态和有用输出。
- 只删除当前运行创建的产物。绝不递归删除测试目录、使用宽泛 glob,或把删除已有或被跟踪的测试当作常规清理。
- 在报告完成或准备提交前,确认记录的路径已不存在,并将限定范围的 git status 与运行前状态比较。若执行被中断,应重新检查而非假设清理已运行。
- 对测试内创建的运行时文件、数据库、绑定和订阅,使用 addTearDown 等测试框架 teardown;它不能替代对临时 Dart 源文件的宿主侧删除。若探针暴露了可复现缺陷,除非用户明确只要临时证据,否则优先将其转为持久回归测试。
四、加载测试层级与替身 在选择边界、伪造对象、插件接缝或原生 UI 覆盖时,加载测试层级与替身相关内容。针对异步不稳定、视觉契约、设备流程或可丢弃测试产物,加载确定性、golden、集成和清理相关内容。
五、验证 在可用时使用 Dart 和 Flutter MCP 测试能力,否则使用仓库既定的测试命令。迭代时运行窄范围测试,然后运行相关套件。独立报告执行面和数据源——例如使用 fixture 的 widget 测试,或调用 staging 的 iOS 模拟器。报告被跳过的平台、不稳定行为或环境依赖,而不是将其视为成功。
六、来源 资料列出的来源包括:Flutter testing、Integration testing、Dart and Flutter MCP server。
关于该技能的具体安装命令、收费方式、支持平台等信息,资料中暂未提供。