vscode-lcov
vscode-lcov copied to clipboard
trafficstars
VSCode LCOV
Renders Line and Branch coverage from lcov.info files interactively.
Live coverage info

Features
- loosely coupled, just point it to a
lcov.infofile and you're in business! - can read multiple
lcov.infofiles (e.g. one for the entire project, one for the last single test run) - generates a Coverage Report
- supports watching certain files and executing a command (e.g. run test on file change)
- supports JavaScript source maps
Coverage Report
Ctrl+TorCmd+Tthen chooseShow Coverage Report
Setting up
- There is a complete simple example at https://github.com/alexandrudima/vscode-lcov/tree/master/examples/fizzbuzz
- There are many tools that can generate
lcov.infofiles - I have tested
lcov.infofiles generated byistanbule.g.istanbul cover --report lcovonly ./node_modules/mocha/bin/_mocha -- -R spec test.js - Configure the paths to your
lcov.infofiles via the settinglcov.path. e.g:
"lcov.path": [
"./.build/coverage/lcov.info",
"./.build/coverage-single/lcov.info"
]
- Live coverage via the setting
lcov.watch. e.g. to execute a certain command any time a.jsfile is changed:
"lcov.watch": [{
"pattern": "**/*.js",
"command": "npm run test-coverage"
}]
- Live coverage can be switched on via
Ctrl+TorCmd+Tthen chooseEnable watchers - JavaScript sourcemaps via the setting
lcov.sourceMaps.
"lcov.sourceMaps": true
Troubleshooting
View>Outputand chooselcov.
Branch coverage: Configuration
"lcov.branchCoverage": "off" or "simple" (default) or "full"
Branch coverage: A single boolean expression
exports.example = function (a) {
if (a) {
console.log('1');
}
}
The above source code contains a single branch block consisting of two branches.
| Test Code | if taken | else taken | "simple" | "full" |
|---|---|---|---|---|
//no calls |
∅ | ∅ | ![]() |
![]() |
example(1) |
✓ | ∅ | ![]() |
![]() |
example(0) |
∅ | ✓ | ![]() |
![]() |
example(0), example(1) |
✓ | ✓ | ![]() |
![]() |
Branch coverage: A binary boolean expression
exports.example = function (a, b) {
if (a && b) {
console.log('1');
}
}
For the table columns:
- IF = if taken
- ELSE = else taken
- A? = a evaluated
- B? = b evaluated
| Test Code | IF | ELSE | A? | B? | "simple" | "full" |
|---|---|---|---|---|---|---|
//no calls |
∅ | ∅ | ∅ | ∅ | ![]() |
![]() |
example(0,0) |
∅ | ✓ | ✓ | ∅ | ![]() |
![]() |
example(0,1) |
∅ | ✓ | ✓ | ∅ | ![]() |
![]() |
example(1,0) |
∅ | ✓ | ✓ | ✓ | ![]() |
![]() |
example(1,1) |
✓ | ∅ | ✓ | ✓ | ![]() |
![]() |
example(0,0), example(0,1) |
∅ | ✓ | ✓ | ∅ | ![]() |
![]() |
example(0,0), example(1,0) |
∅ | ✓ | ✓ | ✓ | ![]() |
![]() |
example(0,0), example(1,1) |
✓ | ✓ | ✓ | ✓ | ![]() |
![]() |
example(0,1), example(1,0) |
∅ | ✓ | ✓ | ✓ | ![]() |
![]() |
example(0,1), example(1,1) |
✓ | ✓ | ✓ | ✓ | ![]() |
![]() |
example(1,0), example(1,1) |
✓ | ✓ | ✓ | ✓ | ![]() |
![]() |
example(0,0), example(0,1), example(1,0) |
∅ | ✓ | ✓ | ✓ | ![]() |
![]() |
example(0,0), example(0,1), example(1,1) |
✓ | ✓ | ✓ | ✓ | ![]() |
![]() |
example(0,0), example(1,0), example(1,1) |
✓ | ✓ | ✓ | ✓ | ![]() |
![]() |
example(0,1), example(1,0), example(1,1) |
✓ | ✓ | ✓ | ✓ | ![]() |
![]() |
Branch coverage: A ternary boolean expression
exports.example = function (a, b, c) {
if (a && b && c) {
console.log('1');
}
}
For the table columns:
- IF = if taken
- ELSE = else taken
- A? = a evaluated
- B? = b evaluated
- C? = c evaluated
| Test Code | IF | ELSE | A? | B? | C? | "full" |
|---|---|---|---|---|---|---|
//no calls |
∅ | ∅ | ∅ | ∅ | ∅ | ![]() |
example(0,0,0) |
∅ | ✓ | ✓ | ∅ | ∅ | ![]() |
example(1,0,0) |
∅ | ✓ | ✓ | ✓ | ∅ | ![]() |
example(1,1,0) |
∅ | ✓ | ✓ | ✓ | ✓ | ![]() |
example(1,1,1) |
✓ | ∅ | ✓ | ✓ | ✓ | ![]() |





























