Merge pull request #3234 from thisch/showcapture_log_support
Add captured-log support to --show-capture
This commit is contained in:
commit
97bb6abcfa
|
@ -87,15 +87,16 @@ def _enter_pdb(node, excinfo, rep):
|
||||||
tw = node.config.pluginmanager.getplugin("terminalreporter")._tw
|
tw = node.config.pluginmanager.getplugin("terminalreporter")._tw
|
||||||
tw.line()
|
tw.line()
|
||||||
|
|
||||||
captured_stdout = rep.capstdout
|
showcapture = node.config.option.showcapture
|
||||||
if len(captured_stdout) > 0:
|
|
||||||
tw.sep(">", "captured stdout")
|
|
||||||
tw.line(captured_stdout)
|
|
||||||
|
|
||||||
captured_stderr = rep.capstderr
|
for sectionname, content in (('stdout', rep.capstdout),
|
||||||
if len(captured_stderr) > 0:
|
('stderr', rep.capstderr),
|
||||||
tw.sep(">", "captured stderr")
|
('log', rep.caplog)):
|
||||||
tw.line(captured_stderr)
|
if showcapture in (sectionname, 'all') and content:
|
||||||
|
tw.sep(">", "captured " + sectionname)
|
||||||
|
if content[-1:] == "\n":
|
||||||
|
content = content[:-1]
|
||||||
|
tw.line(content)
|
||||||
|
|
||||||
tw.sep(">", "traceback")
|
tw.sep(">", "traceback")
|
||||||
rep.toterminal(tw)
|
rep.toterminal(tw)
|
||||||
|
|
|
@ -44,9 +44,9 @@ def pytest_addoption(parser):
|
||||||
help="traceback print mode (auto/long/short/line/native/no).")
|
help="traceback print mode (auto/long/short/line/native/no).")
|
||||||
group._addoption('--show-capture',
|
group._addoption('--show-capture',
|
||||||
action="store", dest="showcapture",
|
action="store", dest="showcapture",
|
||||||
choices=['no', 'stdout', 'stderr', 'both'], default='both',
|
choices=['no', 'stdout', 'stderr', 'log', 'all'], default='all',
|
||||||
help="Controls how captured stdout/stderr is shown on failed tests. "
|
help="Controls how captured stdout/stderr/log is shown on failed tests. "
|
||||||
"Default is 'both'.")
|
"Default is 'all'.")
|
||||||
group._addoption('--fulltrace', '--full-trace',
|
group._addoption('--fulltrace', '--full-trace',
|
||||||
action="store_true", default=False,
|
action="store_true", default=False,
|
||||||
help="don't cut any tracebacks (default is to cut).")
|
help="don't cut any tracebacks (default is to cut).")
|
||||||
|
@ -630,12 +630,12 @@ class TerminalReporter(object):
|
||||||
|
|
||||||
def _outrep_summary(self, rep):
|
def _outrep_summary(self, rep):
|
||||||
rep.toterminal(self._tw)
|
rep.toterminal(self._tw)
|
||||||
if self.config.option.showcapture == 'no':
|
showcapture = self.config.option.showcapture
|
||||||
|
if showcapture == 'no':
|
||||||
return
|
return
|
||||||
for secname, content in rep.sections:
|
for secname, content in rep.sections:
|
||||||
if self.config.option.showcapture != 'both':
|
if showcapture != 'all' and showcapture not in secname:
|
||||||
if not (self.config.option.showcapture in secname):
|
continue
|
||||||
continue
|
|
||||||
self._tw.sep("-", secname)
|
self._tw.sep("-", secname)
|
||||||
if content[-1:] == "\n":
|
if content[-1:] == "\n":
|
||||||
content = content[:-1]
|
content = content[:-1]
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
New ``--show-capture`` command-line option that allows to specify how to display captured output when tests fail: ``no``, ``stdout``, ``stderr`` or ``both`` (the default).
|
New ``--show-capture`` command-line option that allows to specify how to display captured output when tests fail: ``no``, ``stdout``, ``stderr``, ``log`` or ``all`` (the default).
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Captured logs are printed before entering pdb.
|
|
@ -50,26 +50,10 @@ These options can also be customized through ``pytest.ini`` file:
|
||||||
log_format = %(asctime)s %(levelname)s %(message)s
|
log_format = %(asctime)s %(levelname)s %(message)s
|
||||||
log_date_format = %Y-%m-%d %H:%M:%S
|
log_date_format = %Y-%m-%d %H:%M:%S
|
||||||
|
|
||||||
Further it is possible to disable reporting logs on failed tests completely
|
Further it is possible to disable reporting of captured content (stdout,
|
||||||
with::
|
stderr and logs) on failed tests completely with::
|
||||||
|
|
||||||
pytest --no-print-logs
|
pytest --show-capture=no
|
||||||
|
|
||||||
Or in the ``pytest.ini`` file:
|
|
||||||
|
|
||||||
.. code-block:: ini
|
|
||||||
|
|
||||||
[pytest]
|
|
||||||
log_print = False
|
|
||||||
|
|
||||||
|
|
||||||
Shows failed tests in the normal manner as no logs were captured::
|
|
||||||
|
|
||||||
----------------------- Captured stdout call ----------------------
|
|
||||||
text going to stdout
|
|
||||||
----------------------- Captured stderr call ----------------------
|
|
||||||
text going to stderr
|
|
||||||
==================== 2 failed in 0.02 seconds =====================
|
|
||||||
|
|
||||||
|
|
||||||
caplog fixture
|
caplog fixture
|
||||||
|
|
|
@ -187,6 +187,24 @@ class TestPDB(object):
|
||||||
assert "captured stderr" not in output
|
assert "captured stderr" not in output
|
||||||
self.flush(child)
|
self.flush(child)
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('showcapture', ['all', 'no', 'log'])
|
||||||
|
def test_pdb_print_captured_logs(self, testdir, showcapture):
|
||||||
|
p1 = testdir.makepyfile("""
|
||||||
|
def test_1():
|
||||||
|
import logging
|
||||||
|
logging.warn("get " + "rekt")
|
||||||
|
assert False
|
||||||
|
""")
|
||||||
|
child = testdir.spawn_pytest("--show-capture=%s --pdb %s" % (showcapture, p1))
|
||||||
|
if showcapture in ('all', 'log'):
|
||||||
|
child.expect("captured log")
|
||||||
|
child.expect("get rekt")
|
||||||
|
child.expect("(Pdb)")
|
||||||
|
child.sendeof()
|
||||||
|
rest = child.read().decode("utf8")
|
||||||
|
assert "1 failed" in rest
|
||||||
|
self.flush(child)
|
||||||
|
|
||||||
def test_pdb_interaction_exception(self, testdir):
|
def test_pdb_interaction_exception(self, testdir):
|
||||||
p1 = testdir.makepyfile("""
|
p1 = testdir.makepyfile("""
|
||||||
import pytest
|
import pytest
|
||||||
|
|
|
@ -851,31 +851,47 @@ def pytest_report_header(config, startdir):
|
||||||
def test_show_capture(self, testdir):
|
def test_show_capture(self, testdir):
|
||||||
testdir.makepyfile("""
|
testdir.makepyfile("""
|
||||||
import sys
|
import sys
|
||||||
|
import logging
|
||||||
def test_one():
|
def test_one():
|
||||||
sys.stdout.write('!This is stdout!')
|
sys.stdout.write('!This is stdout!')
|
||||||
sys.stderr.write('!This is stderr!')
|
sys.stderr.write('!This is stderr!')
|
||||||
|
logging.warning('!This is a warning log msg!')
|
||||||
assert False, 'Something failed'
|
assert False, 'Something failed'
|
||||||
""")
|
""")
|
||||||
|
|
||||||
result = testdir.runpytest("--tb=short")
|
result = testdir.runpytest("--tb=short")
|
||||||
result.stdout.fnmatch_lines(["!This is stdout!"])
|
result.stdout.fnmatch_lines(["!This is stdout!",
|
||||||
result.stdout.fnmatch_lines(["!This is stderr!"])
|
"!This is stderr!",
|
||||||
|
"*WARNING*!This is a warning log msg!"])
|
||||||
|
|
||||||
result = testdir.runpytest("--show-capture=both", "--tb=short")
|
result = testdir.runpytest("--show-capture=all", "--tb=short")
|
||||||
result.stdout.fnmatch_lines(["!This is stdout!"])
|
result.stdout.fnmatch_lines(["!This is stdout!",
|
||||||
result.stdout.fnmatch_lines(["!This is stderr!"])
|
"!This is stderr!",
|
||||||
|
"*WARNING*!This is a warning log msg!"])
|
||||||
|
|
||||||
result = testdir.runpytest("--show-capture=stdout", "--tb=short")
|
stdout = testdir.runpytest(
|
||||||
assert "!This is stderr!" not in result.stdout.str()
|
"--show-capture=stdout", "--tb=short").stdout.str()
|
||||||
assert "!This is stdout!" in result.stdout.str()
|
assert "!This is stderr!" not in stdout
|
||||||
|
assert "!This is stdout!" in stdout
|
||||||
|
assert "!This is a warning log msg!" not in stdout
|
||||||
|
|
||||||
result = testdir.runpytest("--show-capture=stderr", "--tb=short")
|
stdout = testdir.runpytest(
|
||||||
assert "!This is stdout!" not in result.stdout.str()
|
"--show-capture=stderr", "--tb=short").stdout.str()
|
||||||
assert "!This is stderr!" in result.stdout.str()
|
assert "!This is stdout!" not in stdout
|
||||||
|
assert "!This is stderr!" in stdout
|
||||||
|
assert "!This is a warning log msg!" not in stdout
|
||||||
|
|
||||||
result = testdir.runpytest("--show-capture=no", "--tb=short")
|
stdout = testdir.runpytest(
|
||||||
assert "!This is stdout!" not in result.stdout.str()
|
"--show-capture=log", "--tb=short").stdout.str()
|
||||||
assert "!This is stderr!" not in result.stdout.str()
|
assert "!This is stdout!" not in stdout
|
||||||
|
assert "!This is stderr!" not in stdout
|
||||||
|
assert "!This is a warning log msg!" in stdout
|
||||||
|
|
||||||
|
stdout = testdir.runpytest(
|
||||||
|
"--show-capture=no", "--tb=short").stdout.str()
|
||||||
|
assert "!This is stdout!" not in stdout
|
||||||
|
assert "!This is stderr!" not in stdout
|
||||||
|
assert "!This is a warning log msg!" not in stdout
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.xfail("not hasattr(os, 'dup')")
|
@pytest.mark.xfail("not hasattr(os, 'dup')")
|
||||||
|
|
Loading…
Reference in New Issue