test_runner: exclude ignored lines from BRDA in lcov output#61598
Open
RajeshKumar11 wants to merge 1 commit intonodejs:mainfrom
Open
test_runner: exclude ignored lines from BRDA in lcov output#61598RajeshKumar11 wants to merge 1 commit intonodejs:mainfrom
RajeshKumar11 wants to merge 1 commit intonodejs:mainfrom
Conversation
Collaborator
|
Review requested:
|
JakobJingleheimer
approved these changes
Feb 3, 2026
Member
JakobJingleheimer
left a comment
There was a problem hiding this comment.
Thanks for this!
I'm not familiar with LCOV itself, but the logic looks right.
Comment on lines
596
to
598
| assert.strictEqual(brfMatch[1], brhMatch[1], | ||
| `All branches should be covered when ignored code is not executed. ` + | ||
| `BRF=${brfMatch[1]}, BRH=${brhMatch[1]}`); |
Member
There was a problem hiding this comment.
nit: no mangling please :)
Suggested change
| assert.strictEqual(brfMatch[1], brhMatch[1], | |
| `All branches should be covered when ignored code is not executed. ` + | |
| `BRF=${brfMatch[1]}, BRH=${brhMatch[1]}`); | |
| assert.strictEqual( | |
| brfMatch[1], | |
| brhMatch[1], | |
| `All branches should be covered when ignored code is not executed. BRF=${brfMatch[1]}, BRH=${brhMatch[1]}`, | |
| ); |
Comment on lines
605
to
607
| assert.notStrictEqual(count, '0', | ||
| `No branch should show 0 coverage when the ` + | ||
| `uncovered path is ignored: ${entry}`); |
Member
There was a problem hiding this comment.
nit: no mangling please :)
Suggested change
| assert.notStrictEqual(count, '0', | |
| `No branch should show 0 coverage when the ` + | |
| `uncovered path is ignored: ${entry}`); | |
| assert.notStrictEqual( | |
| count, | |
| '0', | |
| `No branch should show 0 coverage when the uncovered path is ignored: ${entry}`, | |
| ); |
Comment on lines
592
to
595
| const brfMatch = sourceSection.match(/BRF:(\d+)/); | ||
| const brhMatch = sourceSection.match(/BRH:(\d+)/); | ||
| assert(brfMatch, 'LCOV should contain BRF'); | ||
| assert(brhMatch, 'LCOV should contain BRH'); |
Member
There was a problem hiding this comment.
Suggested change
| const brfMatch = sourceSection.match(/BRF:(\d+)/); | |
| const brhMatch = sourceSection.match(/BRH:(\d+)/); | |
| assert(brfMatch, 'LCOV should contain BRF'); | |
| assert(brhMatch, 'LCOV should contain BRH'); | |
| assert.match(sourceSection, /BRF:(\d+)/, 'LCOV should contain BRF'); | |
| assert.match(sourceSection, /BRH:(\d+)/, 'LCOV should contain BRH'); |
Comment on lines
586
to
587
| const sourceSection = lcov.split('end_of_record') | ||
| .find((s) => s.includes('source.js')); |
Member
There was a problem hiding this comment.
nit:
Suggested change
| const sourceSection = lcov.split('end_of_record') | |
| .find((s) => s.includes('source.js')); | |
| const sourceSection = lcov | |
| .split('end_of_record') | |
| .find((s) => s.includes('source.js')); |
or
Suggested change
| const sourceSection = lcov.split('end_of_record') | |
| .find((s) => s.includes('source.js')); | |
| const sourceSection = lcov.split('end_of_record').find((s) => s.includes('source.js')); |
lib/internal/test_runner/coverage.js
Outdated
Comment on lines
204
to
205
| const branchCount = (range.count === 0 && range.ignoredLines > 0) ? | ||
| 1 : range.count; |
Member
There was a problem hiding this comment.
Suggested change
| const branchCount = (range.count === 0 && range.ignoredLines > 0) ? | |
| 1 : range.count; | |
| const branchCount = (range.count === 0 && range.ignoredLines > 0) ? 1 : range.count; |
Author
|
Applied the formatting suggestions, thanks for the review! |
JakobJingleheimer
approved these changes
Feb 5, 2026
Member
JakobJingleheimer
left a comment
There was a problem hiding this comment.
Thanks! I'd like to get someone more familiar with LCOV syntax to review/approve before landing.
When using `/* node:coverage ignore next */` comments, the coverage system correctly excluded lines from DA (line coverage) entries in LCOV output but still reported branches as uncovered (BRDA count=0). This caused branch coverage to show incorrect percentages (e.g., 66% instead of 100%) when the uncovered branch path contained ignored lines, impacting CI/CD pipelines that enforce branch coverage thresholds. The fix treats branches as covered when they have `count === 0` but contain ignored lines (`ignoredLines > 0`). This matches the behavior of c8 and ensures ignored code doesn't penalize branch coverage. Fixes: nodejs#61586
aa9d3db to
5caffef
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
When using
/* node:coverage ignore next */comments, the coverage system correctly excluded lines from DA (line coverage) entries in LCOV output but still reported branches as uncovered (BRDA count=0).This caused branch coverage to show incorrect percentages (e.g., 66% instead of 100%) when the uncovered branch path contained ignored lines, impacting CI/CD pipelines that enforce branch coverage thresholds.
Changes
The fix treats branches as covered when they have
count === 0but contain ignored lines (ignoredLines > 0). This matches the behavior of c8 and ensures ignored code doesn't penalize branch coverage.Before:
After:
Test plan
test/parallel/test-runner-coverage.js0for ignored branchesFixes: #61586