Flutter代码覆盖率插件pull_request_coverage的使用
Flutter代码覆盖率插件pull_request_coverage的使用
Motivation
CI工具中的覆盖率阈值是鼓励开发者编写测试的常见方法。然而,仅基于整个项目的覆盖率来判断拉取请求(PR)并不总是公平的,特别是在进行重大重构任务时,这可能会自然地降低覆盖率。
pull_request_coverage
包采用了一种不同的方法来分析测试覆盖率:它专门关注检查PR中添加的行。通过将未覆盖的新行数除以新行总数来计算覆盖率。此外,您还可以设置导致CI工具测试失败的阈值。该包还可以生成突出显示未覆盖代码的报告,使识别需要额外测试的区域变得更加容易。
Installing
有两种方式可以安装pull_request_coverage
包:
- 从命令行激活它:
dart pub global activate pull_request_coverage
。这将允许您在命令行界面(CLI)上将其作为独立程序使用。 - 添加到项目
pubspec.yaml
文件的dev_dependencies
部分。
Example of pubspec.yaml
dev_dependencies:
pull_request_coverage: ^latest_version
Usage
Generating the lcov.info file
运行以下命令以生成coverage/lcov.info
文件:
flutter test --coverage
如果是在Dart项目而不是Flutter项目中使用,请参考coverage package。
Running pull_request_coverage
要检查PR的代码,pull_request_coverage
需要获取当前分支与目标分支之间的差异。可以通过管道操作符|
将差异输入到pull_request_coverage
中:
git diff repository/main | flutter pub run pull_request_coverage
如果您使用dart pub global activate
激活了pull_request_coverage
,可以直接调用它:
git diff repository/main | pull_request_coverage
更多输出示例请参见Example。
Settings
配置执行pull_request_coverage
有两种方式:使用CLI参数或YAML配置文件。推荐对于大型团队使用YAML文件,因为可以在CI脚本中一致地共享这些设置,而不需要每个开发人员手动复制和粘贴参数。
默认情况下,pull_request_coverage
会查找./pull_request_coverage.yaml
文件加载其设置。您可以使用config-file
参数覆盖此路径。
CLI args Example
git diff origin/main | flutter pub run pull_request_coverage --maximum-uncovered-lines 5 --ignore '/lib/di/**','**/gen.dart' --ignore-lines "^.*@override.*$"
YAML config file Example
maximum-uncovered-lines: 5
ignore:
- /lib/di/**
- "**/gen.dart"
ignore-lines:
- "^.*@override.*$"
Available Options
Input
- lcov-file (
coverage/lcov.info
):由flutter test --coverage
命令生成的lcov.info文件路径。 - config-file (
pull_request_coverage.yaml
):YAML设置文件路径。
Threshold
- minimum-coverage :指定测试通过所需的最小覆盖率。
- maximum-uncovered-lines :指定允许的最大未覆盖行数,超过此数值则测试失败。
- approval-requirement (
lines-and-rate
):当同时指定了minimum-coverage
和maximum-uncovered-lines
时,确定测试通过的条件。lines-and-rate
:两个条件都必须满足才能通过测试。lines-or-rate
:只需要满足一个条件即可通过测试。
Filters
- ignore:忽略的文件列表,使用广泛熟知的Bash glob语法。
- ignore-lines:用于过滤源代码行的正则表达式列表。
- ignore-known-generated-files (
true
):忽略以.g.dart
,.pb.dart
,.pbenum.dart
,.pbserver.dart
或.pbjson.dart
结尾的文件路径。 - add-to-known-generated-files:扩展
ignore-known-generated-files
中指定的列表的glob匹配器列表。与ignore
不同,这些模式匹配的行将完全排除在报告之外。
Presentation
- output-mode (
cli
):指定输出格式。- cli:这种输出格式设计为在命令行界面(CLI)上阅读。
- markdown:这种输出使用Markdown语法格式化,适用于由机器人发布在PR评论中显示。
- markdown-mode (
diff
):指定Markdown输出格式。- diff:使用diff语法高亮未覆盖行。
- dart:使用Dart语法显示代码,并在未覆盖行末尾添加注释。
- report-fully-covered-files (
true
):打印每个完全覆盖文件的文件路径作为庆祝消息。 - show-uncovered-code (
true
):设置为true
时,将以红色字体颜色打印未覆盖行的源代码,便于识别缺失的测试;若设置为false
,日志中只显示文件路径。 - use-colorful-output (
true
):默认情况下,pull_request_coverage
使用彩色字体高亮未覆盖行。可以设置此参数为false
禁用此功能。请注意,此选项仅在输出模式设置为cli
时可用。 - print-emojis (
true
):启用或禁用输出中的表情符号。 - fraction-digits (
2
):指定覆盖率中小数点后的位数。 - fully-tested-message:当没有未测试行时,用自定义消息替换最终表格报告。
Under the hood
- stdin-timeout (
1
):pull_request_coverage
从标准输入读取差异。在某些情况下,标准输入流可能永远不会关闭,导致分析卡住。默认情况下,如果在一秒钟内没有接收到数据,pull_request_coverage
认为已经到达EOF。 - log-level (
none
):内部日志级别。可能的值有none
,error
,warning
,info
,debug
和verbose
。
Exit code
- 0 - 测试通过。
- 1 - 测试失败(仅当设置了阈值时)。
- 255 - 执行失败且测试未执行。
示例demo
CLI output
flutter test --coverage
git diff origin/main | pull_request_coverage --maximum-uncovered-lines 5 --minimum-coverage 99
Markdown output
flutter test --coverage
git diff origin/main | pull_request_coverage --maximum-uncovered-lines 5 --minimum-coverage 99 --output-mode markdown
Markdown output using dart
mode
flutter test --coverage
git diff origin/main | pull_request_coverage --maximum-uncovered-lines 5 --minimum-coverage 99 --output-mode markdown --markdown-mode dart
以上内容提供了关于如何在Flutter项目中使用pull_request_coverage
插件的详细说明。希望对您有所帮助!
更多关于Flutter代码覆盖率插件pull_request_coverage的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter代码覆盖率插件pull_request_coverage的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中集成并使用pull_request_coverage
插件来生成和展示代码覆盖率的详细步骤,包括相关的代码和配置示例。
1. 安装必要的依赖
首先,确保你的Flutter项目已经设置了代码覆盖率工具,比如lcov
和genhtml
,这些工具通常与lcov
包一起安装。
然后,在你的Flutter项目的根目录下,添加以下依赖到你的pubspec.yaml
文件中(注意:pull_request_coverage
实际上不是一个Flutter插件,而是一个GitHub Action或类似的CI/CD工具配置,这里我们假设你指的是如何在CI/CD环境中集成代码覆盖率报告):
dev_dependencies:
flutter_test:
sdk: flutter
虽然pull_request_coverage
不是直接添加到pubspec.yaml
的,但你需要确保你的测试环境已经设置好。
2. 配置.github/workflows
接下来,在你的Flutter项目的根目录下创建或编辑.github/workflows/flutter.yml
文件,以配置GitHub Actions来运行测试和生成覆盖率报告。
name: Flutter CI
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: subosito/flutter-action@v1
with:
channel: stable
- name: Get dependencies
run: flutter pub get
- name: Run tests with coverage
run: flutter test --coverage
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v1
with:
file: ./coverage/lcov.info
在这个配置中,我们使用了flutter-action
来设置Flutter环境,运行flutter test --coverage
来生成覆盖率报告,并使用codecov/codecov-action
将覆盖率报告上传到Codecov(你也可以选择其他服务,如Coveralls,但配置会有所不同)。
3. 生成覆盖率报告
当你推送代码到GitHub时,GitHub Actions会自动运行上述工作流。测试运行后,覆盖率报告将生成在./coverage
目录下,通常是一个lcov.info
文件。
4. 查看覆盖率报告
- Codecov: 如果你选择了Codecov,你可以在Codecov的网站上查看详细的覆盖率报告,并且Codecov还会在你的GitHub PR中留下评论,展示覆盖率的变化。
- GitHub: GitHub本身也支持在PR中展示覆盖率报告,但这通常需要额外的配置,比如使用
pull_request_target
事件类型或者通过第三方服务集成。
5. (可选)本地查看覆盖率报告
如果你想在本地查看覆盖率报告,可以运行以下命令将报告转换为HTML格式:
genhtml coverage/lcov.info -o coverage/report --legend
然后,你可以在浏览器中打开coverage/report/index.html
来查看详细的覆盖率报告。
总结
虽然pull_request_coverage
不是一个具体的Flutter插件,但通过上述步骤,你可以在Flutter项目中集成代码覆盖率报告,并在GitHub PR中展示这些报告。这通常涉及到配置GitHub Actions、运行测试并生成覆盖率报告,以及使用像Codecov这样的服务来展示这些报告。