Flutter测试覆盖率插件test_cov的使用

发布于 1周前 作者 eggper 来自 Flutter

Flutter测试覆盖率插件test_cov的使用

test_cov 是一个简单的命令行工具,用于从Dart VM测试中收集测试覆盖率信息。它在本地开发过程中生成覆盖率报告非常有用。

使用方法

  1. 添加依赖项

    在你的 pubspec.yaml 文件中添加 test_cov 作为开发依赖项:

    dev_dependencies:
      test_cov: ^0.2.1
    

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

  2. 运行测试覆盖率工具

    在项目的根目录下运行以下命令:

    pub run test_cov
    

    这将生成一个名为 coverage/lcov.info 的文件,其中包含测试覆盖率信息。

  3. 生成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 工具执行以下步骤:

  1. 生成 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();
    }
    
  2. 运行测试

    使用以下命令运行测试:

    dart --pause-isolates-on-exit --enable-vm-service test/.test_cov.dart
    
  3. 收集和格式化覆盖率信息

    测试执行完成后,工具会使用 coverage 包的功能来收集和格式化覆盖率报告。

完整示例Demo

假设我们有一个简单的Flutter项目,并且已经编写了一些单元测试。以下是完整的步骤,展示如何使用 test_cov 生成测试覆盖率报告。

  1. 项目结构

    假设你的项目结构如下:

    my_flutter_app/
    ├── lib/
    │   └── main.dart
    ├── test/
    │   ├── some_test.dart
    │   ├── nested/
    │   │   └── other_test.dart
    │   └── some_other_test.dart
    ├── pubspec.yaml
    └── .gitignore
    
  2. 添加 test_cov 依赖

    修改 pubspec.yaml 文件,添加 test_cov 作为开发依赖项:

    dev_dependencies:
      test_cov: ^0.2.1
    

    然后运行 pub get 安装依赖项。

  3. 运行 test_cov

    在项目的根目录下运行以下命令:

    pub run test_cov
    

    这将生成 coverage/lcov.info 文件。

  4. 生成HTML报告

    如果你已经安装了 lcov,可以使用以下命令生成HTML报告:

    genhtml -o coverage coverage/lcov.info
    open coverage/index.html
    

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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用test_coverage插件来生成测试覆盖率的示例。test_coverage插件本身并不是Flutter官方插件,但Flutter项目通常使用Dart的coverage包和lcov等工具来生成和格式化覆盖率报告。

这里我们将使用Dart的package:test_coveragelcov工具来生成覆盖率报告。

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项目中使用覆盖率插件和工具生成测试覆盖率报告的示例。希望这对你有所帮助!

回到顶部