Test coverage in Dart & Flutter
Unit tests improve productivity dramatically. With enough coverage, you can make changes quickly while ensuring you have not broken any significant piece.
How it works
You run your unit tests and a tool measures which lines have been tested. The information is stored in an lcov*.info file. Later an IDE or other tool can use it to show you reports or highlight which lines have not been covered.
Generate the lcov file
Flutter
This command runs the tests and stores the coverage info to coverage/lcov.info
.
flutter test --coverage
On https://github.com/flutter/flutter/wiki/Test-coverage-for-package:flutter, they mention merging with a base lcov file, but that's only because they pregenerate that base file for their project.
Dart
See the docs. Install coverage:
pub global activate coverage
Run the tests:
dart --pause-isolates-on-exit --enable-vm-service=NNNN test/*
Collect data into coverage.json:
collect_coverage -o coverage/coverage.json --uri=[theuri output the previous command]
Convert to lcov:
format_coverage -l -i coverage/coverage.json -o coverage/lcov.info --packages=.packages --report-on=lib
report-on
filters the coverage to only my own code, and not any its dependencies.
I tried to pipe collect_coverage
into format_coverage
to run it in one command, but format_coverage
does not support it. It fails because it requires an input file or directory.
Viewing the data
As a global report
Install lcov. On my Mac I ran: brew install lcov
. I found the command in this post. Once installed, run:
genhtml coverage/lcov.info -o coverage
-o
specifies the output directory. If you don't specify it, it will pollute your lib folder with a bunch of html files.
Inline in Visual Studio
In Visual Studio Code, open the Extensions tab and install Coverage Gutters. Once you've reloaded, you have two options:
- See it once in a file. If you close and reopen the file, the coloring will be gone. To do so, run the command "Coverage Gutters: Display Coverage" from the Command Palette in the file that you wish to analyze. Surprisingly it takes a few even though you are viewing only one file. And my CPU ran hot even in a small project.
- See it in all files, always: open the lcov file, and click Watch. The extension will take a few minutes, and eventually display code coverage in your dart code by highlighting lines in red or green.
And it does not matter if your coverage/ folder is at the root of your workspace, or if your workspace contains several projects.
However, it is still hit and miss. I have not completely figured this out yet.