Flutter覆盖视图插件coverde的使用

Flutter覆盖视图插件coverde的使用

coverde 是一个用于基本覆盖率跟踪文件操作的命令行工具。以下是如何在项目中使用 coverde 的详细说明。

安装

你可以通过执行以下命令全局安装 coverde

$ dart pub global activate coverde

注意: 若要直接从终端运行 coverde,请将系统缓存 bin 目录添加到你的 PATH 环境变量中。

功能

coverde check

检查从跟踪文件计算出的覆盖率值。

选项

  • --input | -i 覆盖率检查所用的跟踪文件。 默认值: coverage/lcov.info

标志

  • --verbose | -v 是否打印覆盖率值。 使用 --no-verbose 可禁用此标志。 默认值: 启用

参数

  • <min_coverage> 一个介于0和100之间的整数,用作最小可接受覆盖率值。 此值是必需的。

示例

coverde check 90
coverde check -i lcov.info 75
coverde check 100 --no-verbose

结果

检查示例(通过)

检查示例(未通过)

coverde filter

过滤跟踪文件中包含的测试文件。

选项

  • --input | -i 需要过滤的覆盖率跟踪文件。 默认值: coverage/lcov.info

  • --output | -o 过滤后的覆盖率跟踪文件(如果不存在则自动生成)。 默认值: coverage/filtered.lcov.info

  • --paths-parent | -p 过滤后路径的前缀。 默认值: 无

  • --filters | -f 一组逗号分隔的模式,表示要排除在覆盖率之外的文件。 默认值: 无

  • --mode | -m 过滤后跟踪文件内容应生成的模式。 a: 追加内容。 w: 覆盖内容。 默认值: a (追加内容)

示例

coverde filter
coverde filter -f '\.g\.dart'
coverde filter -f '\.freezed\.dart' -mode w
coverde filter -f generated -mode a
coverde filter -o coverage/trace-file.info

coverde remove

删除一组文件和文件夹。

标志

  • --accept-absence 指定命令的行为根据文件/文件夹的存在情况。 如果启用,命令将继续并通知元素缺失。 如果禁用,命令失败。 使用 --no-accept-absence 可禁用此标志。 默认值: 启用

参数

  • <paths> 需要删除的一组路径。 多个路径可以通过空格分隔。 此值是必需的。

示例

coverde remove file.txt
coverde remove path/to/folder/
coverde remove path/to/another.file.txt path/to/another/folder/ local.folder/

coverde report

生成HTML覆盖率报告。

选项

  • --input | -i 用于报告生成的覆盖率跟踪文件。 默认值: coverage/lcov.info

  • --output | -o 生成的报告文件放置的目的文件夹。 默认值: coverage/html/

  • --medium 覆盖率值的中等阈值。 默认值: 75

  • --high 覆盖率值的高阈值。 默认值: 90

注意事项

报告样式会根据个体、组和整体覆盖率动态设置,并且取决于 --medium--high 选项。

标志

  • --launch | -l 是否在默认浏览器中启动生成的报告。 使用 --no-launch 可禁用此标志。 默认值: 禁用

示例

coverde report
coverde report -i coverage/trace-file.info --medium 50
coverde report -o coverage/report --high 95 -l

结果

报告示例(目录)

报告示例(文件)

coverde value

计算并显示从跟踪文件得出的覆盖率值。

选项

  • --input | -i 用于覆盖率值计算的覆盖率跟踪文件。 默认值: coverage/lcov.info

标志

  • --verbose | -v 是否为跟踪文件中引用的每个源文件打印覆盖率值。 使用 --no-verbose 可禁用此标志。 默认值: 启用

示例

coverde value
coverde value -i coverage/trace-file.info --no-verbose

melos 的使用

如果你的项目使用 melos 来管理多包结构,可以使用 coverde 在统一的跟踪文件中收集测试覆盖率数据。

定义如下 melos 脚本:

merge-trace-files:
  description: 合并所有包的覆盖率跟踪文件,忽略生成文件的数据。
  run: >
    coverde rm MELOS_ROOT_PATH/coverage/filtered.lcov.info &&
    melos exec --file-exists=coverage/lcov.info -- "coverde filter --input ./coverage/lcov.info --output MELOS_ROOT_PATH/coverage/filtered.lcov.info --paths-parent MELOS_PACKAGE_PATH --filters '\.g\.dart'"

merge-trace-files 是合并所有测试包覆盖率跟踪文件的 melos 脚本。

首先,脚本会移除项目根目录下 coverage 文件夹中的 filtered.lcov.info 文件(如果存在)。

然后,脚本会对每个包含 coverage/lcov.info 文件的包执行 coverde filter 命令,使用其内容作为输入,将结果写入项目根目录下的 filtered.lcov.info 文件。

过滤后的跟踪文件忽略了带有 .g.dart 扩展名的生成文件的数据。

每个引用的文件路径都以包路径为前缀,因此生成的合并跟踪文件包含了一组表示实际项目结构的路径,这对于 coverde report 命令正确生成HTML报告至关重要。

CI 集成中的覆盖率检查

如果你的项目使用 GitHub Actions 进行 CI,你可能已经知道 very_good_coverage,它提供了一种简单但有效的覆盖率验证方法。

然而,向其他 CI 工作流程添加覆盖率检查并不总是那么简单。

为了解决这个问题,在启用 Dart 或 Flutter 的 CI 流程后,根据项目需求,可以添加以下命令到工作流程步骤中:

dart pub global activate coverde
coverde check <min_coverage>

更多关于Flutter覆盖视图插件coverde的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter覆盖视图插件coverde的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


coverde 是一个 Flutter 插件,用于在现有视图上覆盖一个新的视图。它可以帮助你在应用中实现一些特殊的效果,例如在现有视图上覆盖一个半透明的遮罩、显示一个弹窗、或者在特定区域显示额外的信息。

安装 coverde 插件

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

dependencies:
  flutter:
    sdk: flutter
  coverde: ^0.1.0  # 请使用最新版本

然后运行 flutter pub get 来安装插件。

使用 coverde 插件

coverde 插件提供了一个 Coverde 小部件,你可以将它包裹在现有的小部件上,然后在上面覆盖一个新的视图。

以下是一个简单的示例,展示了如何使用 coverde 插件:

import 'package:flutter/material.dart';
import 'package:coverde/coverde.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Coverde Example'),
        ),
        body: Center(
          child: Coverde(
            cover: Container(
              color: Colors.black.withOpacity(0.5),
              child: Center(
                child: Text(
                  'This is a cover',
                  style: TextStyle(color: Colors.white, fontSize: 24),
                ),
              ),
            ),
            child: Container(
              width: 200,
              height: 200,
              color: Colors.blue,
              child: Center(
                child: Text(
                  'Main Content',
                  style: TextStyle(color: Colors.white, fontSize: 18),
                ),
              ),
            ),
          ),
        ),
      ),
    );
  }
}
回到顶部