In monorepos with multiple Dart and Flutter packages, this CLI tool will combine all lcov.info files into a single lcov.info file that will display correctly using tools like genhtml, Coveralls and others.

A CLI tool for combining Dart & Flutter code coverage reports in a monorepo.

Usage: combine_coverage [arguments]

Global options:
-h, --help                     Print this usage information
-p, --repo-path (mandatory)    The path to the root of your monorepo
-o, --output-directory         The path where you want to output the combined coverage file. Defaults to <repo-path>/coverage

Example

Note: We recommend melos to manage the execution of these steps in large monorepos.

If we have multiple Dart and Flutter packages in a monorepo and want to generate a single, shared lcov.info file to represent all coverage, we can follow these steps:

1. Run unit tests with the --coverage flag

In each Flutter package, run:

flutter test --coverage

In each Dart package, run:

dart test --coverage=./coverage

2. Convert test coverage output for Dart packages to lcov format

By default, Dart outputs json coverage reports, but we can use the coverage package to format the Dart test coverage output in lcov format. In each Dart package run...

dart pub global run coverage:format_coverage --in="./coverage/test" --out="./coverage/lcov.info" --lcov --report-on="./lib"

3. Combine the coverage reports

Now that we have an lcov file in each package in our monorepo, we just need to run combine_coverage. If you have added dart scripts to your PATH use the following:

combine_coverage --repo-path="<path-to-your-monorepo>"

Otherwise, you can use the following:

dart pub global run combine_coverage --repo-path="<path-to-your-monorepo>"

In the monorepo's root there will now be a file at coverage/lcov.info that combines the coverage output for all packages with corrected file paths. This file can be passed to any visualization tool to make a full and accurate coverage report.

If you'd like to specify a directory to place the combined lcov file, use the --output-directory flag.