其他
Dart/Flutter 项目需要收集测试覆盖率并生成…
在 Dart 或 Flutter 项目中自动或手动收集测试覆盖率、生成 LCOV 报告,并通过忽略指令排除指定代码。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 35/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 40/100 ×0.15
适用场景
Dart/Flutter 项目需要收集测特定
解决思路
- 使用标准 Dart 测试范式组织测试套件:Dart 项目用 `package:test`,Flutter 项目用 `flutter_test`。
- 编写 Unit Tests 验证单个函数、方法或类。
- 编写 Component/Widget Tests 验证组件行为、布局与交互,使用 mock 对象(`package:mockito`)。
- 编写 Integration Tests 在模拟或真实设备上验证完整应用流程。
- 用内联注释将特定行、代码块或整个文件排除出覆盖率统计。
- 忽略单行:`// coverage:ignore-line`。
- 忽略代码块:`// coverage:ignore-start` 和 `// coverage:ignore-end`。
- 忽略整个文件:`// coverage:ignore-file`。
- 格式化时传 `--check-ignore` 标志以强制执行这些忽略指令。
- 将 `coverage` 包添加为 `dev_dependency`,不要添加到普通 dependencies。
- Dart 项目执行:`dart pub add dev:coverage`。
- Flutter 项目执行:`flutter pub add dev:coverage`。
- 使用内置 `test_with_coverage` 脚本:自动运行所有测试、从 Dart VM 收集 JSON 覆盖率数据并格式化为 LCOV 报告。
- 执行:`dart run coverage:test_with_coverage`。
- 若在 Dart workspace(monorepo)中,显式指定测试目录,例如 `dart run coverage:test_with_coverage -- pkgs/foo/test pkgs/bar/test`。
- 验证项目根目录下创建了 `coverage/` 目录。
- 确保存在 `coverage/coverage.json`(原始数据)和 `coverage/lcov.info`(格式化报告)。
- 如果特定文件缺少覆盖率,确保它们被测试文件导入并执行;若有意排除,则添加 `// coverage:ignore-file`。
- 如需对 VM service 细粒度控制、暂停 isolate 或需要分支/函数级覆盖率,使用手动收集工作流。
- 运行测试并启用 VM service:暂停 isolate 退出,并在指定端口(如 8181)暴露 VM service。命令:`dart run --pause-isolates-on-exit --disable-service-auth-codes --enable-vm-service=8181 test &`。
- 从运行中的 VM service 提取覆盖率数据并输出到 JSON 文件。命令:`dart run coverage:collect_coverage --wait-paused --uri=http://127.0.0.1:8181/ -o coverage/coverage.json --resume-isolates`。
- 可选:追加 `--function-coverage` 和 `--branch-coverage` 获取更深层指标(要求 Dart VM 2.17.0+)。
- 将原始 JSON 转换为标准 LCOV 格式。命令:`dart run coverage:format_coverage --packages=.dart_tool/package_config.json --lcov -i coverage/coverage.json -o coverage/lcov.info --check-ignore`。
- 确保 `pubspec.yaml` 中 `coverage` 仅位于 `dev_dependencies` 下。
- 对生成代码或不可测试的边界情况应用忽略指令,避免降低覆盖率分数。
适用边界 · 注意事项
- 非 Dart/Flutter 项目不适用。
- 只需要运行测试而不需要覆盖率报告时不需要此流程。
- 手动高级收集的分支/函数级覆盖率需要 Dart VM 2.17.0+,不满足时无法获取这些深层指标。