coveragepy / coveragepy/coveragepy
coverage of multiline generator/set/dict comprehensions is wrong when run with pytest's assertion rewriting
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 3.4k
- Forks
- 525
- Avg merge
- 18h 27m
- Merged PRs (30d)
- 6
Description
Originally reported by Andy Freeland (Bitbucket: rouge8, GitHub: rouge8)
Code/config to reproduce available as a gist. Fails on Python 2.7 but not Python 3.5.
Essentially, given this test:
def test_foo():
# covered!
assert {i for i in range(10)} == {i for i in range(10)}
# "didn't finish the set comprehension"
assert {i for i in range(10)} == {
i for i in range(10)
}
# covered!
assert True
When run under pytest with assertion rewriting (the default), the multiline set comprehension is reported as partially covered, even though the comprehension on oneline is fully covered. I think this is a bug in coverage, not pytest's assertion rewriting, because this code passes:
import ast
from _pytest.assertion.rewrite import rewrite_asserts
oneline = """assert {i for i in range(10)} == {i for i in range(10)}"""
multiline = """assert {i for i in range(10)} == {
i for i in range(10)
}"""
# Parse the expressions
oneline_tree = ast.parse(oneline)
multiline_tree = ast.parse(multiline)
# Dump the pre-assertion rewrite ASTs
multiline_dump_prerewrite = ast.dump(multiline_tree)
oneline_dump_prerewrite = ast.dump(oneline_tree)
# The ASTs should be the same
assert multiline_dump_prerewrite == oneline_dump_prerewrite
# Rewrite the asserts
rewrite_asserts(oneline_tree)
rewrite_asserts(multiline_tree)
# Dump the rewritten ASTs
oneline_dump_rewrite = ast.dump(oneline_tree)
multiline_dump_rewrite = ast.dump(multiline_tree)
# The ASTs should be the same
assert oneline_dump_rewrite == multiline_dump_rewrite
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the linked reproduction gist and compare coverage results for the one-line and multiline comprehensions when pytest assertion rewriting is enabled. Trace how coverage handles the rewritten AST and confirm the fix by showing that the multiline comprehension is reported as fully covered.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- testing-qa
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 48/100