Merge pull request #2235 from bluetech/dont-execute-properties

ignore property errors when parsing fixure factories
This commit is contained in:
Bruno Oliveira 2017-02-07 23:41:36 -02:00 committed by GitHub
commit a4fb971c1f
4 changed files with 22 additions and 3 deletions

View File

@ -118,6 +118,7 @@ Piotr Banaszkiewicz
Punyashloka Biswal
Quentin Pradet
Ralf Schmitt
Ran Benita
Raphael Pierzina
Raquel Alegre
Roberto Polli

View File

@ -3,6 +3,9 @@
*
* Ignore exceptions raised from descriptors (e.g. properties) during Python test collection (`#2234`_).
Thanks to `@bluetech`_.
* Replace ``raise StopIteration`` usages in the code by simple ``returns`` to finish generators, in accordance to `PEP-479`_ (`#2160`_).
Thanks `@tgoodlet`_ for the report and `@nicoddemus`_ for the PR.
@ -16,6 +19,10 @@
*
.. _#2234: https://github.com/pytest-dev/pytest/issues/2234
.. _@bluetech: https://github.com/bluetech
.. _#2160: https://github.com/pytest-dev/pytest/issues/2160
.. _PEP-479: https://www.python.org/dev/peps/pep-0479/

View File

@ -14,6 +14,7 @@ from _pytest.compat import (
getfslineno, get_real_func,
is_generator, isclass, getimfunc,
getlocation, getfuncargnames,
safe_getattr,
)
def pytest_sessionstart(session):
@ -124,8 +125,6 @@ def getfixturemarker(obj):
exceptions."""
try:
return getattr(obj, "_pytestfixturefunction", None)
except KeyboardInterrupt:
raise
except Exception:
# some objects raise errors like request (from flask import request)
# we don't expect them to be fixture functions
@ -1068,7 +1067,9 @@ class FixtureManager:
self._holderobjseen.add(holderobj)
autousenames = []
for name in dir(holderobj):
obj = getattr(holderobj, name, None)
# The attribute can be an arbitrary descriptor, so the attribute
# access below can raise. safe_getatt() ignores such exceptions.
obj = safe_getattr(holderobj, name, None)
# fixture functions have a pytest_funcarg__ prefix (pre-2.3 style)
# or are "@pytest.fixture" marked
marker = getfixturemarker(obj)

View File

@ -166,6 +166,16 @@ class TestClass:
"because it has a __new__ constructor*"
)
def test_issue2234_property(self, testdir):
testdir.makepyfile("""
class TestCase(object):
@property
def prop(self):
raise NotImplementedError()
""")
result = testdir.runpytest()
assert result.ret == EXIT_NOTESTSCOLLECTED
class TestGenerator:
def test_generative_functions(self, testdir):