dart-collect-coverage

dart-collect-coverage

热门

使用 coverage 包收集测试覆盖率数据并生成 LCOV 报告

2792Star
164Fork
更新于 2026/8/5
SKILL.md
只读
名称
dart-collect-coverage
描述

使用 coverage 包收集测试覆盖率数据并生成 LCOV 报告

实现 Dart 与 Flutter 的测试覆盖率统计

目录

测试基础

请遵循标准的 Dart 测试范式组织测试套件。Dart 项目建议使用 package:test,Flutter 项目建议使用 flutter_test

  • 单元测试(Unit Tests): 验证独立的函数、方法或类。
  • 组件/Widget 测试(Component/Widget Tests): 借助 Mock 对象(package:mockito)验证组件的行为、布局与交互。
  • 集成测试(Integration Tests): 在模拟器或真实设备上验证完整的应用流程。

覆盖率忽略指令

可以通过行内注释将特定行、代码块或整个文件从覆盖率统计中排除。格式化时传入 --check-ignore 参数即可强制生效这些指令。

  • 忽略单行:// coverage:ignore-line
  • 忽略代码块:// coverage:ignore-start// coverage:ignore-end
  • 忽略整个文件:// coverage:ignore-file

工作流:配置并生成覆盖率报告

请按照以下顺序执行工作流:添加 coverage 依赖包、运行测试,并生成 LCOV 报告。

任务进度检查清单:

  • [ ] 1. 将 coverage 添加为 dev_dependency
  • [ ] 2. 运行自动覆盖率收集脚本。
  • [ ] 3. 校验 LCOV 输出结果。

1. 添加依赖

coverage 包添加为项目的 dev_dependency(开发依赖)。切勿将其放入常规依赖项中。

如果是标准的 Dart 项目:

dart pub add dev:coverage

如果是 Flutter 项目:

flutter pub add dev:coverage

2. 收集覆盖率并生成 LCOV

使用内置的 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)。

3. 反馈循环:校验输出

运行校验工具 -> 排查错误 -> 修复问题:

  1. 确认项目根目录下已生成 coverage/ 目录。
  2. 确保 coverage/coverage.json(原始数据)和 coverage/lcov.info(格式化报告)均已成功生成。
  3. 如果某些文件缺失覆盖率数据,请确保它们已被测试文件导入并执行;若是有意排除,请添加 // coverage:ignore-file

工作流:进阶手动收集覆盖率

如果需要细粒度控制 VM service、Isolate 暂停,或需要函数级/分支级的覆盖率数据,请使用手动收集工作流。

任务进度检查清单:

  • [ ] 1. 在启用 VM service 的情况下运行测试。
  • [ ] 2. 收集原始 JSON 覆盖率数据。
  • [ ] 3. 将 JSON 格式化为 LCOV。

1. 启动 VM service 运行测试

执行测试时在退出时暂停 Isolate,并在特定端口(如 8181)暴露 VM service。

dart run --pause-isolates-on-exit --disable-service-auth-codes --enable-vm-service=8181 test &

2. 收集原始覆盖率

从运行中的 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+)。

3. 格式化为 LCOV

将原始 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 配置

确保 pubspec.yaml 中将 coverage 包严格配置在 dev_dependencies 下。

name: my_dart_app
environment:
  sdk: ^3.0.0

dependencies:
  path: ^1.8.0

dev_dependencies:
  test: ^1.24.0
  coverage: ^1.15.0

示例:使用忽略指令

使用忽略指令,防止生成的代码或无法测试的边缘情况降低整体覆盖率得分。

// coverage:ignore-file
import 'package:meta/meta.dart';

class SystemConfig {
  final String env;

  SystemConfig(this.env);

  // coverage:ignore-start
  void legacyInit() {
    print('Deprecated initialization');
  }
  // coverage:ignore-end

  bool isProduction() {
    if (env == 'prod') return true;
    return false; // coverage:ignore-line
  }
}