Flutter代码覆盖率排除插件remove_from_coverage的使用

Flutter代码覆盖率排除插件remove_from_coverage的使用

Remove from Coverage

Remove from Coverage 是一个由 Jack Warren 开发的工具,用于从 lcov.info 覆盖率文件中移除符合给定模式的文件。这可以帮助我们排除生成文件或其他不需要包含在覆盖率报告中的文件。

特性

  • 支持多种模式:可以提供多个路径模式来排除文件。
  • 语言无关:不仅可以用于 Dart 项目,也可以用于其他语言项目。
  • 灵活的输入输出:可以直接操作 lcov.info 文件,也可以通过标准输入/输出流进行处理。

使用方法

该工具可以通过命令行参数 -f 指定要操作的 lcov.info 文件,并通过 -r 参数指定要排除的文件路径模式。如果未提供 lcov.info 文件,则会从标准输入读取并输出到标准输出。

命令格式

remove_from_coverage -f <FILE> -r <PATTERN>
  • -f, --file=<FILE>: 指定目标 lcov.info 文件。
  • -r, --remove=<PATTERN>: 指定要排除的文件路径模式,可以使用正则表达式。
  • -h, --help: 显示帮助信息。

示例

假设你想要从代码覆盖率报告中移除以 .g.dart 结尾的生成文件:

  1. 生成 lcov.info 文件: 使用测试覆盖率工具(如 test_cov)生成 lcov.info 文件:

    dart run test_cov
    
  2. 移除生成文件: 如果 pub global 脚本在你的 PATH 中,你可以直接运行:

    remove_from_coverage -f coverage/lcov.info -r '\.g\.dart$'
    

    否则,你可以使用以下命令:

    dart global run remove_from_coverage:remove_from_coverage -f coverage/lcov.info -r '\.g\.dart$'
    

完整示例项目

下面是一个完整的示例项目,展示了如何使用 remove_from_coverage 来修正覆盖率数据。

项目结构

/example
  ├── lib
  │   └── name.dart
  │   └── name.g.dart
  ├── test
  │   └── name_test.dart
  └── coverage
      └── lcov.info

项目解释

  • name.dart 包含一个不可变的 Name 类,使用 built_value 自动生成 toString 方法、== 操作符和构建器。
  • name.g.dart 是由 built_value 自动生成的文件,链接到 name.dart
  • name_test.dart 测试了 name.dart 的功能。

问题

尽管 name_test.dart 充分测试了 name.dart,但代码覆盖率工具还会评估 name.g.dart 的覆盖率。如果我们不希望测试生成文件,这些文件可能会导致较低的覆盖率百分比。

解决方案

使用 remove_from_coverage 工具从 lcov.info 文件中移除生成文件的数据,使得生成的报告更准确。

remove_from_coverage -f coverage/lcov.info -r '.g.dart$'

dart global run remove_from_coverage:remove_from_coverage -f coverage/lcov.info -r '.g.dart$'

注意事项

  • 通常情况下,生成文件不应添加到源码控制中。为了便于在线浏览示例,这里添加了 name.g.dart.test_coverage.dart
  • 整个 coverage 目录也不需要添加到源码控制中。

通过以上步骤,你可以有效地使用 remove_from_coverage 工具来优化你的 Flutter 项目的代码覆盖率报告。


更多关于Flutter代码覆盖率排除插件remove_from_coverage的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter代码覆盖率排除插件remove_from_coverage的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用remove_from_coverage插件来排除特定代码段以提高代码覆盖率报告的准确性。remove_from_coverage插件通过注释来标记不需要包含在覆盖率报告中的代码。

步骤 1: 添加依赖

首先,你需要在pubspec.yaml文件中添加remove_from_coverage依赖:

dependencies:
  flutter:
    sdk: flutter
  remove_from_coverage: ^0.2.0  # 请检查最新版本号

然后运行flutter pub get来安装依赖。

步骤 2: 使用注释排除代码

在需要排除的代码段前后添加// @dart=2.9// ignore_for_file: unused_element注释。虽然remove_from_coverage插件本身不需要特定语法(因为它主要通过配置文件工作),但Flutter社区通常使用这些注释结合配置文件来达到目的。不过,为了直接展示如何标记代码,这里我们采用一种更直接的方法,即通过配置文件结合注释实现(虽然remove_from_coverage插件本身可能不直接依赖这些注释,但这是一种通用做法)。

实际上,remove_from_coverage更常用于配置文件中指定排除路径或文件,但为了展示如何在代码中标记(尽管这不是该插件的直接用法),我们可以这样做:

// @dart=2.9
// This is an example of excluding a specific function from coverage reports
// by marking it with comments. However, note that remove_from_coverage plugin
// typically works via configuration files rather than in-code comments.
void _excludedFunction() {
  // Your code here
  print('This function will be excluded from coverage reports.');
}

// ignore_for_file: unused_element
void main() {
  // Your main function code
  runApp(MyApp());
  // Call the excluded function to demonstrate (but it won't affect coverage)
  _excludedFunction();
}

步骤 3: 使用remove_from_coverage配置排除文件或路径

实际上,remove_from_coverage插件更常用的方法是通过在analysis_options.yaml文件中配置排除规则。以下是一个示例配置:

  1. 在项目根目录下创建或编辑analysis_options.yaml文件。
  2. 添加remove_from_coverage配置:
include: package:remove_from_coverage/analysis_options.yaml

# Add your custom exclude rules here
analyzer:
  exclude:
    - "**/*.g.dart"
    - "lib/generated/**"
    - "test/dummy_data/**"  # Example paths to exclude

这个配置文件将包含remove_from_coverage的默认分析选项,并允许你添加自己的排除规则。

注意

  • 直接在代码中添加注释(如上面的// @dart=2.9// ignore_for_file: unused_element)并不是remove_from_coverage插件的标准用法,而是为了说明如何标记代码(尽管这些注释本身对覆盖率工具可能有用)。
  • remove_from_coverage插件主要通过配置文件来排除文件或路径,这是更常见和推荐的做法。

通过上述步骤,你可以有效地使用remove_from_coverage插件来提高Flutter项目的代码覆盖率报告的准确性。

回到顶部