diff --git a/changelog/4400.bugfix.rst b/changelog/4400.bugfix.rst new file mode 100644 index 000000000..eb0df7eca --- /dev/null +++ b/changelog/4400.bugfix.rst @@ -0,0 +1 @@ +Rearrange warning handling for the yield test errors so the opt-out in 4.0.x correctly works. diff --git a/src/_pytest/python.py b/src/_pytest/python.py index d360e2c8f..8912ca060 100644 --- a/src/_pytest/python.py +++ b/src/_pytest/python.py @@ -741,16 +741,20 @@ class FunctionMixin(PyobjMixin): class Generator(FunctionMixin, PyCollector): def collect(self): + # test generators are seen as collectors but they also # invoke setup/teardown on popular request # (induced by the common "test_*" naming shared with normal tests) from _pytest import deprecated + self.warn(deprecated.YIELD_TESTS) + self.session._setupstate.prepare(self) # see FunctionMixin.setup and test_setupstate_is_preserved_134 self._preservedparent = self.parent.obj values = [] seen = {} + _Function = self._getcustomclass("Function") for i, x in enumerate(self.obj()): name, call, args = self.getcallargs(x) if not callable(call): @@ -764,11 +768,7 @@ class Generator(FunctionMixin, PyCollector): "%r generated tests with non-unique name %r" % (self, name) ) seen[name] = True - with warnings.catch_warnings(): - # ignore our own deprecation warning - function_class = self.Function - values.append(function_class(name, self, args=args, callobj=call)) - self.warn(deprecated.YIELD_TESTS) + values.append(_Function(name, self, args=args, callobj=call)) return values def getcallargs(self, obj): diff --git a/testing/test_session.py b/testing/test_session.py index e2c3701da..0dc98a703 100644 --- a/testing/test_session.py +++ b/testing/test_session.py @@ -4,6 +4,7 @@ from __future__ import print_function import pytest from _pytest.main import EXIT_NOTESTSCOLLECTED +from _pytest.warnings import SHOW_PYTEST_WARNINGS_ARG class SessionTests(object): @@ -77,7 +78,8 @@ class SessionTests(object): """ def test_1(): yield None - """ + """, + SHOW_PYTEST_WARNINGS_ARG, ) failures = reprec.getfailedcollections() out = failures[0].longrepr.reprcrash.message