VSCode LCOV
Renders Line and Branch coverage from lcov.info files interactively.
Live coverage info
Features
- loosely coupled, just point it to a
lcov.info file and you're in business!
- can read multiple
lcov.info files (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+T or Cmd+T then choose Show 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.info files
- I have tested
lcov.info files generated by istanbul e.g.istanbul cover --report lcovonly ./node_modules/mocha/bin/_mocha -- -R spec test.js
- Configure the paths to your
lcov.info files via the setting lcov.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 .js file is changed:
"lcov.watch": [{
"pattern": "**/*.js",
"command": "npm run test-coverage"
}]
- Live coverage can be switched on via
Ctrl+T or Cmd+T then choose Enable watchers
- JavaScript sourcemaps via the setting
lcov.sourceMaps .
"lcov.sourceMaps": true
Troubleshooting
View > Output and choose lcov .
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) |
✓ |
∅ |
✓ |
✓ |
✓ |
|
| |