diff --git a/py/test/defaultconftest.py b/py/test/defaultconftest.py index 91622956b..0bdcb6868 100644 --- a/py/test/defaultconftest.py +++ b/py/test/defaultconftest.py @@ -10,5 +10,5 @@ Generator = py.test.collect.Generator Function = py.test.collect.Function Instance = py.test.collect.Instance -pytest_plugins = "default iocapture runner terminal keyword xfail tmpdir execnetcleanup monkeypatch recwarn pdb unittest".split() +pytest_plugins = "default runner iocapture terminal keyword xfail tmpdir execnetcleanup monkeypatch recwarn pdb unittest".split() diff --git a/py/test/plugin/pytest_iocapture.py b/py/test/plugin/pytest_iocapture.py index 46c031090..5302d7743 100644 --- a/py/test/plugin/pytest_iocapture.py +++ b/py/test/plugin/pytest_iocapture.py @@ -34,10 +34,6 @@ def pytest_addoption(parser): action="store_true", dest="nocapture", default=False, help="disable catching of stdout/stderr during test run.") -def pytest_configure(config): - if not config.option.nocapture: - config.pluginmanager.register(CapturePerTest()) - def determine_capturing(config, path=None): iocapture = config.getvalue("iocapture", path=path) if iocapture == "fd": @@ -50,6 +46,28 @@ def determine_capturing(config, path=None): # how to raise errors here? raise config.Error("unknown io capturing: " + iocapture) +def pytest_make_collect_report(__call__, collector): + cap = determine_capturing(collector.config, collector.fspath) + try: + rep = __call__.execute(firstresult=True) + finally: + outerr = cap.reset() + addouterr(rep, outerr) + return rep + +def addouterr(rep, outerr): + repr = getattr(rep, 'longrepr', None) + if not hasattr(repr, 'addsection'): + return + for secname, content in zip(["out", "err"], outerr): + if content: + repr.addsection("Captured std%s" % secname, content.rstrip()) + +def pytest_configure(config): + if not config.option.nocapture: + config.pluginmanager.register(CapturePerTest()) + + class CapturePerTest: def __init__(self): self.item2capture = {} @@ -78,12 +96,8 @@ class CapturePerTest: outerr = capture.reset() # XXX shift reporting elsewhere rep = __call__.execute(firstresult=True) - if hasattr(rep, 'longrepr'): - repr = rep.longrepr - if hasattr(repr, 'addsection'): - for secname, content in zip(["out", "err"], outerr): - if content: - repr.addsection("Captured std%s" % secname, content.rstrip()) + addouterr(rep, outerr) + return rep def pytest_funcarg__capsys(request): @@ -91,7 +105,7 @@ def pytest_funcarg__capsys(request): them available successively via a ``capsys.reset()`` method which returns a ``(out, err)`` tuple of captured strings. """ - capture = Capture(py.io.StdCapture) + capture = CaptureFuncarg(py.io.StdCapture) request.addfinalizer(capture.finalize) return capture @@ -100,7 +114,7 @@ def pytest_funcarg__capfd(request): them available successively via a ``capsys.reset()`` method which returns a ``(out, err)`` tuple of captured strings. """ - capture = Capture(py.io.StdCaptureFD) + capture = CaptureFuncarg(py.io.StdCaptureFD) request.addfinalizer(capture.finalize) return capture @@ -110,7 +124,7 @@ def pytest_pyfunc_call(pyfuncitem): if funcarg == "capsys" or funcarg == "capfd": value.reset() -class Capture: # funcarg +class CaptureFuncarg: _capture = None def __init__(self, captureclass): self._captureclass = captureclass @@ -126,30 +140,3 @@ class Capture: # funcarg self._capture = self._captureclass() return res -class TestCapture: - def test_std_functional(self, testdir): - reprec = testdir.inline_runsource(""" - def test_hello(capsys): - print 42 - out, err = capsys.reset() - assert out.startswith("42") - """) - reprec.assertoutcome(passed=1) - - def test_stdfd_functional(self, testdir): - reprec = testdir.inline_runsource(""" - def test_hello(capfd): - import os - os.write(1, "42") - out, err = capfd.reset() - assert out.startswith("42") - """) - reprec.assertoutcome(passed=1) - - def test_funcall_yielded_no_funcargs(self, testdir): - reprec = testdir.inline_runsource(""" - def test_hello(): - yield lambda: None - """) - reprec.assertoutcome(passed=1) - diff --git a/py/test/plugin/pytest_runner.py b/py/test/plugin/pytest_runner.py index c43fd14f4..96d34c420 100644 --- a/py/test/plugin/pytest_runner.py +++ b/py/test/plugin/pytest_runner.py @@ -31,7 +31,6 @@ def pytest_sessionfinish(session, exitstatus): mod.raiseExceptions = False def pytest_make_collect_report(collector): - # XXX capturing is missing result = excinfo = None try: result = collector._memocollect()