I'm using coverage.py to measure the code coverage of my tests. I've enabled branch coverage, but I can't quite make sense of the report.
Without branch coverage, I get 100% coverage:
Name Stmts Miss Cover Missing
------------------------------------------------------------
mylib/queries.py 44 0 100%
With branch coverage enabled:
Name Stmts Miss Branch BrPart Cover Missing
--------------------------------------------------------------------------
mylib/queries.py 44 1 20 3 94% 55, 21->10, 53->-48, 59->-58
The source in question can be found here.
21->10 makes sense; the if clause never evaluates to False (jumping back to the beginning of the outer for loop).
However, 53->-48 and 59->-58 have me scratching my head. What do they mean?
Dan's comment is close. First, the negative numbers mean, an exit from a function starting at that line number. So -48 means, exit from the function starting at line 48.
The issue isn't empty loops: those branches would have happened if the loops ever completed. It looks like perhaps they did not.
BTW: Coverage.py 4.1b3 has changed some of this behavior: they'd be marked as
53->exit, 59->exit. Also, the branches themselves might be identified differently. Give it a try.