Flutter测试覆盖率插件test_cov的使用
Flutter测试覆盖率插件test_cov的使用
test_cov
是一个简单的命令行工具,用于从Dart VM测试中收集测试覆盖率信息。它在本地开发过程中生成覆盖率报告非常有用。
使用方法
-
添加依赖项
在你的
pubspec.yaml
文件中添加test_cov
作为开发依赖项:dev_dependencies: test_cov: ^0.2.1
然后运行
pub get
来安装依赖项。 -
运行测试覆盖率工具
在项目的根目录下运行以下命令:
pub run test_cov
这将生成一个名为
coverage/lcov.info
的文件,其中包含测试覆盖率信息。 -
生成HTML报告
如果你已经安装了
lcov
工具(对于Mac用户,可以通过brew install lcov
安装),你可以使用genhtml
命令生成HTML格式的覆盖率报告:genhtml -o coverage coverage/lcov.info # 在Mac上打开默认浏览器查看报告: open coverage/index.html
集成
生成的 coverage/lcov.info
文件可以直接被Codecov命令行工具消费,因此不需要额外的步骤。
此库尚未与Coveralls进行测试。
已知限制
- 该库是为运行Dart VM测试而创建的,尚未针对Web平台(编译为JavaScript)的Dart代码进行测试,可能无法正常工作。
- 对于Flutter项目,建议使用
flutter test --coverage
来收集覆盖率信息,而不是使用test_cov
。
工作原理
test_cov
工具执行以下步骤:
-
生成
test/.test_cov.dart
文件该文件是一个“测试所有”脚本,会自动导入并运行所有测试文件。建议将此文件添加到
.gitignore
中,避免提交到版本控制系统。示例
test/.test_cov.dart
文件内容如下:// Auto-generated by test_cov. Do not edit by hand. // Consider adding this file to your .gitignore. import 'some_test.dart' as some_test; import 'nested/other_test.dart' as other_test; import 'some_other_test.dart' as some_other_test; void main() { some_test.main(); other_test.main(); some_other_test.main(); }
-
运行测试
使用以下命令运行测试:
dart --pause-isolates-on-exit --enable-vm-service test/.test_cov.dart
-
收集和格式化覆盖率信息
测试执行完成后,工具会使用
coverage
包的功能来收集和格式化覆盖率报告。
完整示例Demo
假设我们有一个简单的Flutter项目,并且已经编写了一些单元测试。以下是完整的步骤,展示如何使用 test_cov
生成测试覆盖率报告。
-
项目结构
假设你的项目结构如下:
my_flutter_app/ ├── lib/ │ └── main.dart ├── test/ │ ├── some_test.dart │ ├── nested/ │ │ └── other_test.dart │ └── some_other_test.dart ├── pubspec.yaml └── .gitignore
-
添加
test_cov
依赖修改
pubspec.yaml
文件,添加test_cov
作为开发依赖项:dev_dependencies: test_cov: ^0.2.1
然后运行
pub get
安装依赖项。 -
运行
test_cov
在项目的根目录下运行以下命令:
pub run test_cov
这将生成
coverage/lcov.info
文件。 -
生成HTML报告
如果你已经安装了
lcov
,可以使用以下命令生成HTML报告:genhtml -o coverage coverage/lcov.info open coverage/index.html
更多关于Flutter测试覆盖率插件test_cov的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter测试覆盖率插件test_cov的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter项目中使用test_coverage
插件来生成测试覆盖率的示例。test_coverage
插件本身并不是Flutter官方插件,但Flutter项目通常使用Dart的coverage
包和lcov
等工具来生成和格式化覆盖率报告。
这里我们将使用Dart的package:test_coverage
和lcov
工具来生成覆盖率报告。
1. 添加依赖
首先,在你的pubspec.yaml
文件中添加必要的依赖项。注意,test_coverage
不是一个官方插件,但我们可以使用Dart的coverage
包来收集覆盖率数据。
dev_dependencies:
test: ^1.20.1 # 确保你有一个合适的test版本
coverage: ^1.0.3 # 用于收集覆盖率数据
2. 收集覆盖率数据
创建一个脚本来运行测试并收集覆盖率数据。在项目的根目录下创建一个名为collect_coverage.dart
的文件,内容如下:
import 'dart:io';
import 'package:test/test.dart' as test;
import 'package:coverage/coverage.dart';
void main(List<String> args) async {
// 运行测试并收集覆盖率数据
final Directory currentDir = Directory.current;
final Directory testDir = currentDir.subdirectory('test');
final Directory coverageDir = currentDir.subdirectory('.dart_coverage');
coverageDir.createSync(recursive: true);
await test.run(<String>[], onExit: (int code) async {
if (code != 0) {
exit(code);
}
final List<FileSystemEntity> testFiles = testDir.listSync(recursive: true, followLinks: false)
.whereType<File>()
.where((File file) => file.path.endsWith('_test.dart')).toList();
final List<Uri> testUris = testFiles.map((File file) => file.uri).toList();
final CoverageCollector collector = await CoverageCollector.collect(testUris);
final File coverageFile = coverageDir.childFile('coverage.json');
coverageFile.writeAsStringSync(collector.toJson());
print('Coverage data written to ${coverageFile.path}');
});
}
3. 生成LCOV报告
接下来,我们需要将覆盖率数据转换为LCOV格式。为此,我们可以使用一个简单的Dart脚本或者一个现成的工具。这里我们假设你使用了一个现成的工具,比如dart-coveralls
(尽管它主要用于CI集成,但它也提供了将覆盖率数据转换为LCOV的功能)。
首先,全局安装dart-coveralls
:
dart pub global activate dart_coveralls
然后,你可以创建一个脚本来调用它,或者手动运行以下命令:
dart pub global run dart_coveralls report --retry 2 --in .dart_coverage/coverage.json --out lcov.info
这将生成一个lcov.info
文件,你可以使用任何支持LCOV格式的工具(如HTML生成器)来查看覆盖率报告。
4. 在CI中集成
如果你想在CI中集成覆盖率报告,你可以将上述步骤放入CI配置文件中。例如,在.github/workflows/ci.yml
中添加以下步骤:
name: CI
on: [push]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: dart-lang/setup-dart@v1
- name: Get dependencies
run: dart pub get
- name: Run tests and collect coverage
run: dart bin/collect_coverage.dart
- name: Convert coverage to LCOV
run: dart pub global run dart_coveralls report --retry 2 --in .dart_coverage/coverage.json --out lcov.info
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v2
with:
token: ${{ secrets.CODECOV_TOKEN }}
file: ./lcov.info
请确保你已经在GitHub Secrets中添加了CODECOV_TOKEN
。
以上就是在Flutter项目中使用覆盖率插件和工具生成测试覆盖率报告的示例。希望这对你有所帮助!