用途:这是一套 Flutter 测试策略规则,适用于 test/ 与 integration_test/ 下所有测试。核心主张是让测试形状跟随代码而非测试金字塔比例,测试应断言构建要么通过要么失败的行为。
主要能力与规则:把业务规则放进不含 Flutter/插件/IO 导入的纯包,用 package:test 测试;时间统一用 package:clock 的 Clock,禁止 DateTime.now() 与自定义 ClockService,测试中用 withClock(Clock.fixed(t)) 固定,Riverpod 代码通过 clockProvider 覆盖。每个转换需往返测试(decode(encode(x))==x)与边界取整黄金值;通用断言用带种子的模糊测试并对照独立 oracle,失败时在 reason: 中打印输入。数据层用 NativeDatabase.memory() 测试,禁止 mock DAO,teardown 中 db.close()。自有依赖优先用 bare-implements 假实现而非 mock,mocktail 仅用于外部依赖,并为每个自定义 any() 类型调用 registerFallbackValue。Notifier 通过 ProviderContainer 无头测试,用 overrideWith 注入依赖并在 teardown dispose。保留一个端到端验收门槛并加运行时 assert 绊线。对迁移、金额分配原语、解析器等高危文件保持 100% 覆盖下限,按 diff 评审而非百分比门槛;注意 flutter test --coverage 会遗漏未被导入的文件导致虚高。禁止对无限动画使用 pumpAndSettle(),改用 fakeAsync 下的定时 pump。
使用方式:提交 PR 前运行 scripts/check_test_hygiene.sh 与 scripts/run_tests.sh。纯逻辑测试用 dart test,仅 UI 与插件封装测试需要 flutter_test。
适用场景与限制:适合采用 Flutter、Riverpod、Drift 的项目,涉及 widget 黄金测试、RTL 与无障碍部分由 widget-golden-and-a11y-testing 负责。模拟器无法复现的路径(真实音频、OEM 设备差异、无 Flutter 引擎的原生界面)应列入人工预发布清单,不得伪造通过。其余具体配置与平台信息暂未提供。