Flutter代码覆盖率分析插件code_coverage的使用

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

Flutter代码覆盖率分析插件code_coverage的使用

代码覆盖率 (Code Coverage)

code_coverage 是一个命令行应用和包,用于Dart应用程序的代码覆盖率报告。

命令行界面 (CLI)

使用方法 (Usage)

安装完成后,你可以在你的包的基本目录下运行 code_coverage。输出结果将类似于以下内容:

Running package tests...
┌────────────────────┬────────────┬───────────────────┐
│ File               │ Coverage % │ Uncovered Lines   │
├────────────────────┼────────────┼───────────────────┤
│ All covered files  │      45.83 │                   │
│ src/utils.dart     │      52.38 │ 38-42, 44, 48-51  │
│ src/constants.dart │       0.00 │ 3-5               │
└────────────────────┴────────────┴───────────────────┘
18.18% (2/11) of all files were covered

如上所示,命令行工具会运行你的包的测试,并输出一个表格,显示哪些文件被覆盖以及覆盖了多少。

配置 (Configuration)

这些选项和标志可用于配置覆盖率报告:

  • –showOutput, -o:此选项将显示 dart test 的输出,因此总输出将类似于以下内容:
Running package tests...
00:00 +0: test\utils_test.dart: should concatenate small group of lines as a range
00:00 +1: test\utils_test.dart: should concatenate medium group of lines as a range
00:00 +2: test\utils_test.dart: should concatenate two lines as separate
00:00 +3: test\utils_test.dart: should concatenate lines as range and separate
00:00 +4: test\utils_test.dart: should concatenate lines with a range followed by another range
00:00 +5: test\utils_test.dart: should concatenate lines as two ranges and two separate
00:03 +6: All tests passed!
┌───────────────────┬────────────┬──────────────────┐
│ File              │ Coverage % │ Uncovered Lines  │
├───────────────────┼────────────┼──────────────────┤
│ All covered files │      45.83 │                  │
| src               |      45.83 |                  |
│   utils.dart      │      52.38 │ 38-42, 44, 48-51 │
│   constants.dart  │       0.00 │ 3-5              │
└───────────────────┴────────────┴──────────────────┘
18.18% (2/11) of all files were covered
  • –showUncovered, -u:此选项将显示未覆盖文件的列表,这将看起来像这样:
Running package tests...
┌───────────────────┬────────────┬─────────────────┐
│ File              │ Coverage % │ Uncovered Lines │
├───────────────────┼────────────┼─────────────────┤
│ All covered files │      80.00 │                 │
│ a.dart            │      80.00 │ 20-21           │
└───────────────────┴────────────┴─────────────────┘
50.00% (1/2) of all files were covered

Uncovered files:

- b.dart
  • –packageDir, -d:使用此选项可以指定要测试的包的目录;

  • –minimum, -m:此选项允许你要求最小的代码覆盖率,如果行或文件覆盖率未达到指定值,则进程将以退出码1退出;

  • –include, -i:允许你指定多个正则表达式,这些正则表达式将与所有路径匹配,那些匹配任何正则表达式的路径将包含在报告中。例如,使用正则表达式 utils,输出将如下所示:

Running package tests...
┌────────────────────┬────────────┬──────────────────┐
│ File               │ Coverage % │ Uncovered Lines  │
├────────────────────┼────────────┼──────────────────┤
│ All covered files  │      52.38 │                  │
│ src/utils.dart     │      52.38 │ 38-42, 44, 48-51 │
└────────────────────┴────────────┴──────────────────┘
100% (1/1) of all files were covered
  • –exclude, -e:允许你指定多个正则表达式,这些正则表达式将与所有路径匹配,那些不匹配所有正则表达式的路径将包含在报告中。例如,使用正则表达式 utils,输出将如下所示:
┌────────────────────┬────────────┬─────────────────┐
│ File               │ Coverage % │ Uncovered Lines │
├────────────────────┼────────────┼─────────────────┤
│ All covered files  │       0.00 │                 │
│ src/constants.dart │       0.00 │ 3-5             │
└────────────────────┴────────────┴─────────────────┘
20% (2/10) of all files were covered
  • –ignoreBarrelFiles:在创建代码覆盖率报告时忽略筒仓文件;

  • –inlineFiles:打印文件路径在一个单行中,而不通过文件夹分离文件。示例输出:

Running package tests...
┌────────────────────┬────────────┬──────────────────┐
│ File               │ Coverage % │ Uncovered Lines  │
├────────────────────┼────────────┼──────────────────┤
│ All covered files  │      45.83 │                  │
| src/utils.dart     │      52.38 │ 38-42, 44, 48-51 │
│ src/constants.dart │       0.00 │ 3-5              │
└────────────────────┴────────────┴──────────────────┘
18.18% (2/11) of all files were covered

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

1 回复

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


当然,以下是如何在Flutter项目中使用code_coverage插件进行代码覆盖率分析的步骤,包括相关的代码和配置示例。

1. 添加依赖

首先,确保你的Flutter项目已经配置好基本的pubspec.yaml文件。然后,在项目的根目录下的dev_dependencies中添加flutter_testcoverage包(尽管flutter_test是默认包含的,但这里为了完整性还是列出)。

dev_dependencies:
  flutter_test:
    sdk: flutter
  coverage: ^1.0.3  # 请检查最新版本号

2. 配置test命令

为了生成覆盖率报告,我们需要自定义Flutter的测试命令。在pubspec.yaml文件中,添加以下脚本配置:

scripts:
  test-with-coverage: >-
    flutter test --coverage &&
    genhtml coverage/lcov.info -o coverage/html &&
    open coverage/html/index.html

这个脚本做了以下几件事:

  1. 运行Flutter测试并生成覆盖率数据。
  2. 使用genhtml工具(来自lcov包,通常需要单独安装)将覆盖率数据转换为HTML格式。
  3. 打开生成的HTML覆盖率报告。

注意open命令在Windows上可能不起作用,你可能需要手动打开生成的HTML文件。此外,genhtml工具可能需要通过安装lcov来获取。

3. 安装lcov

在macOS上,你可以通过Homebrew安装lcov

brew install lcov

在Ubuntu上,你可以通过APT安装:

sudo apt-get install lcov

在Windows上,你可能需要查找相应的安装方法或使用WSL(Windows Subsystem for Linux)。

4. 运行测试并生成覆盖率报告

在终端中,运行以下命令来执行测试并生成覆盖率报告:

flutter pub get
flutter pub run test:test-with-coverage

这将执行测试,生成覆盖率数据,将其转换为HTML格式,并在默认浏览器中打开覆盖率报告。

5. 查看覆盖率报告

打开的HTML文件将显示你的Flutter项目的代码覆盖率报告。你可以看到哪些代码行被测试覆盖,哪些没有被覆盖。

示例代码

假设你有一个简单的Flutter项目,并且你想测试以下Widget:

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

class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Text('Hello, Flutter!'),
    );
  }
}

你可以编写一个测试来覆盖这个Widget:

// my_widget_test.dart
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/material.dart';
import 'my_widget.dart';

void main() {
  testWidgets('MyWidget renders correctly', (WidgetTester tester) async {
    await tester.pumpWidget(MaterialApp(
      home: Scaffold(
        body: MyWidget(),
      ),
    ));

    expect(find.text('Hello, Flutter!'), findsOneWidget);
  });
}

运行上述的test-with-coverage脚本,你将看到包括my_widget.dart在内的代码覆盖率报告。

总结

通过上述步骤,你可以在Flutter项目中集成代码覆盖率分析,并使用生成的HTML报告来识别哪些代码被测试覆盖,哪些没有。这对于确保你的应用程序具有高质量的测试覆盖非常有帮助。

回到顶部