fix capturing to be more careful during teardown when a setup never happened (due to e.g. an error in user-provided runtest_setup code)
--HG-- branch : trunk
This commit is contained in:
parent
77b640d1b7
commit
9d01975c78
|
@ -9,6 +9,9 @@ Changes between 1.X and 1.1.1
|
|||
|
||||
- new "pytestconfig" funcarg allows access to test config object
|
||||
|
||||
- robustify capturing to survive if custom pytest_runtest_setup
|
||||
code failed and prevented the capturing setup code from running.
|
||||
|
||||
- make py.test.* helpers provided by default plugins visible early -
|
||||
works transparently both for pydoc and for interactive sessions
|
||||
which will regularly see e.g. py.test.mark and py.test.importorskip.
|
||||
|
|
|
@ -161,16 +161,20 @@ class CaptureManager:
|
|||
cap.resume()
|
||||
self._capturing = method
|
||||
|
||||
def suspendcapture(self):
|
||||
def suspendcapture(self, item=None):
|
||||
self.deactivate_funcargs()
|
||||
method = self._capturing
|
||||
if method != "no":
|
||||
cap = self._method2capture[method]
|
||||
outerr = cap.suspend()
|
||||
else:
|
||||
outerr = "", ""
|
||||
del self._capturing
|
||||
return outerr
|
||||
if hasattr(self, '_capturing'):
|
||||
method = self._capturing
|
||||
if method != "no":
|
||||
cap = self._method2capture[method]
|
||||
outerr = cap.suspend()
|
||||
else:
|
||||
outerr = "", ""
|
||||
del self._capturing
|
||||
if item:
|
||||
outerr = (item.outerr[0] + outerr[0], item.outerr[1] + outerr[1])
|
||||
return outerr
|
||||
return "", ""
|
||||
|
||||
def activate_funcargs(self, pyfuncitem):
|
||||
if not hasattr(pyfuncitem, 'funcargs'):
|
||||
|
@ -210,9 +214,6 @@ class CaptureManager:
|
|||
def pytest_runtest_teardown(self, item):
|
||||
self.resumecapture_item(item)
|
||||
|
||||
def pytest_runtest_teardown(self, item):
|
||||
self.resumecapture_item(item)
|
||||
|
||||
def pytest__teardown_final(self, __multicall__, session):
|
||||
method = self._getmethod(session.config, None)
|
||||
self.resumecapture(method)
|
||||
|
@ -231,8 +232,7 @@ class CaptureManager:
|
|||
def pytest_runtest_makereport(self, __multicall__, item, call):
|
||||
self.deactivate_funcargs()
|
||||
rep = __multicall__.execute()
|
||||
outerr = self.suspendcapture()
|
||||
outerr = (item.outerr[0] + outerr[0], item.outerr[1] + outerr[1])
|
||||
outerr = self.suspendcapture(item)
|
||||
if not rep.passed:
|
||||
addouterr(rep, outerr)
|
||||
if not rep.passed or rep.when == "teardown":
|
||||
|
|
|
@ -379,3 +379,15 @@ class TestCaptureFuncarg:
|
|||
])
|
||||
assert result.ret == 2
|
||||
|
||||
def test_setup_failure_does_not_kill_capturing(testdir):
|
||||
sub1 = testdir.mkpydir("sub1")
|
||||
sub1.join("conftest.py").write(py.code.Source("""
|
||||
def pytest_runtest_setup(item):
|
||||
raise ValueError(42)
|
||||
"""))
|
||||
sub1.join("test_mod.py").write("def test_func1(): pass")
|
||||
result = testdir.runpytest(testdir.tmpdir, '--traceconfig')
|
||||
result.stdout.fnmatch_lines([
|
||||
"*ValueError(42)*",
|
||||
"*1 error*"
|
||||
])
|
||||
|
|
Loading…
Reference in New Issue