Merge pull request #1243 from aselus-hub/master

Update python.py
This commit is contained in:
Bruno Oliveira 2015-12-11 00:33:46 -02:00
commit 85d1f0404a
4 changed files with 29 additions and 1 deletions

View File

@ -71,3 +71,4 @@ Eric Hunsberger
Simon Gomizelj
Russel Winder
Ben Webb
Alexei Kozlenok

View File

@ -1,6 +1,10 @@
2.8.5.dev0
----------
- fix #1243: fixed injection to class breaking collection step, by replacing
generated interation with list traversal, added test to verify in python/collect.py
PR by Alexei Kozlenok, Thanks Ronny Pfannschmidt and Nicoddemus for the review and help.
- fix #1074: precompute junitxml chunks instead of storing the whole tree in objects
Thanks Bruno Oliveira for the report and Ronny Pfannschmidt for the PR

View File

@ -451,7 +451,7 @@ class PyCollector(PyobjMixin, pytest.Collector):
seen = {}
l = []
for dic in dicts:
for name, obj in dic.items():
for name, obj in list(dic.items()):
if name in seen:
continue
seen[name] = True

View File

@ -1076,3 +1076,26 @@ def test_dont_collect_non_function_callable(testdir):
'WC2 *',
'*1 passed, 1 pytest-warnings in *',
])
def test_class_injection_does_not_break_collection(testdir):
"""Tests whether injection during collection time will terminate testing.
In this case the error should not occur if the TestClass itself
is modified during collection time, and the original method list
is still used for collection.
"""
testdir.makeconftest("""
from test_inject import TestClass
def pytest_generate_tests(metafunc):
TestClass.changed_var = {}
""")
testdir.makepyfile(test_inject='''
class TestClass(object):
def test_injection(self):
"""Test being parametrized."""
pass
''')
result = testdir.runpytest()
assert "RuntimeError: dictionary changed size during iteration" not in result.stdout.str()
result.stdout.fnmatch_lines(['*1 passed*'])