factor out _get_line_with_reprcrash_message
This commit is contained in:
parent
3d0ecd03ed
commit
37ecca3ba9
|
@ -0,0 +1 @@
|
||||||
|
Messages from crash reports are displayed within test summaries now, truncated to the terminal width.
|
|
@ -204,31 +204,49 @@ def pytest_terminal_summary(terminalreporter):
|
||||||
tr._tw.line(line)
|
tr._tw.line(line)
|
||||||
|
|
||||||
|
|
||||||
|
def _get_line_with_reprcrash_message(config, rep, termwidth):
|
||||||
|
"""Get summary line for a report, trying to add reprcrash message."""
|
||||||
|
verbose_word = _get_report_str(config, rep)
|
||||||
|
pos = _get_pos(config, rep)
|
||||||
|
|
||||||
|
line = "%s %s" % (verbose_word, pos)
|
||||||
|
|
||||||
|
len_line = len(line)
|
||||||
|
ellipsis = "..."
|
||||||
|
len_ellipsis = len(ellipsis)
|
||||||
|
|
||||||
|
if len_line > termwidth - len_ellipsis:
|
||||||
|
# No space for an additional message.
|
||||||
|
return line
|
||||||
|
|
||||||
|
try:
|
||||||
|
msg = rep.longrepr.reprcrash.message
|
||||||
|
except AttributeError:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
# Only use the first line.
|
||||||
|
i = msg.find("\n")
|
||||||
|
if i != -1:
|
||||||
|
msg = msg[:i]
|
||||||
|
len_msg = len(msg)
|
||||||
|
|
||||||
|
sep = ": "
|
||||||
|
len_sep = len(sep)
|
||||||
|
max_len = termwidth - len_line - len_sep
|
||||||
|
if max_len >= len_ellipsis:
|
||||||
|
if len_msg > max_len:
|
||||||
|
msg = msg[: (max_len - len_ellipsis)] + ellipsis
|
||||||
|
line += sep + msg
|
||||||
|
return line
|
||||||
|
|
||||||
|
|
||||||
def show_simple(terminalreporter, lines, stat):
|
def show_simple(terminalreporter, lines, stat):
|
||||||
failed = terminalreporter.stats.get(stat)
|
failed = terminalreporter.stats.get(stat)
|
||||||
if failed:
|
if failed:
|
||||||
config = terminalreporter.config
|
config = terminalreporter.config
|
||||||
|
termwidth = terminalreporter.writer.fullwidth
|
||||||
for rep in failed:
|
for rep in failed:
|
||||||
verbose_word = _get_report_str(config, rep)
|
line = _get_line_with_reprcrash_message(config, rep, termwidth)
|
||||||
pos = _get_pos(config, rep)
|
|
||||||
|
|
||||||
line = "%s %s" % (verbose_word, pos)
|
|
||||||
try:
|
|
||||||
msg = rep.longrepr.reprcrash.message
|
|
||||||
except AttributeError:
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
# Only use the first line.
|
|
||||||
# Might be worth having a short_message property, which
|
|
||||||
# could default to this behavior.
|
|
||||||
i = msg.find("\n")
|
|
||||||
if i != -1:
|
|
||||||
msg = msg[:i]
|
|
||||||
max_len = terminalreporter.writer.fullwidth - len(line) - 2
|
|
||||||
if len(msg) > max_len:
|
|
||||||
msg = msg[: (max_len - 1)] + "…"
|
|
||||||
line += ": %s" % msg
|
|
||||||
|
|
||||||
lines.append(line)
|
lines.append(line)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1211,3 +1211,47 @@ def test_summary_list_after_errors(testdir):
|
||||||
"FAILED test_summary_list_after_errors.py::test_fail: assert 0",
|
"FAILED test_summary_list_after_errors.py::test_fail: assert 0",
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_line_with_reprcrash(monkeypatch):
|
||||||
|
import _pytest.skipping
|
||||||
|
from _pytest.skipping import _get_line_with_reprcrash_message
|
||||||
|
|
||||||
|
def mock_get_report_str(*args):
|
||||||
|
return "FAILED"
|
||||||
|
|
||||||
|
def mock_get_pos(*args):
|
||||||
|
return "some::nodeid"
|
||||||
|
|
||||||
|
monkeypatch.setattr(_pytest.skipping, "_get_report_str", mock_get_report_str)
|
||||||
|
monkeypatch.setattr(_pytest.skipping, "_get_pos", mock_get_pos)
|
||||||
|
|
||||||
|
class config:
|
||||||
|
pass
|
||||||
|
|
||||||
|
class rep:
|
||||||
|
pass
|
||||||
|
|
||||||
|
f = _get_line_with_reprcrash_message
|
||||||
|
assert f(config, rep, 80) == "FAILED some::nodeid"
|
||||||
|
|
||||||
|
class rep:
|
||||||
|
class longrepr:
|
||||||
|
class reprcrash:
|
||||||
|
message = "msg"
|
||||||
|
|
||||||
|
assert f(config, rep, 80) == "FAILED some::nodeid: msg"
|
||||||
|
assert f(config, rep, 3) == "FAILED some::nodeid"
|
||||||
|
|
||||||
|
assert f(config, rep, 23) == "FAILED some::nodeid"
|
||||||
|
assert f(config, rep, 24) == "FAILED some::nodeid: msg"
|
||||||
|
|
||||||
|
rep.longrepr.reprcrash.message = "some longer message"
|
||||||
|
assert f(config, rep, 23) == "FAILED some::nodeid"
|
||||||
|
assert f(config, rep, 24) == "FAILED some::nodeid: ..."
|
||||||
|
assert f(config, rep, 25) == "FAILED some::nodeid: s..."
|
||||||
|
|
||||||
|
rep.longrepr.reprcrash.message = "some\nmessage"
|
||||||
|
assert f(config, rep, 24) == "FAILED some::nodeid: ..."
|
||||||
|
assert f(config, rep, 25) == "FAILED some::nodeid: some"
|
||||||
|
assert f(config, rep, 80) == "FAILED some::nodeid: some"
|
||||||
|
|
|
@ -735,7 +735,7 @@ def test_fail_extra_reporting(testdir, monkeypatch):
|
||||||
result.stdout.fnmatch_lines(
|
result.stdout.fnmatch_lines(
|
||||||
[
|
[
|
||||||
"*test summary*",
|
"*test summary*",
|
||||||
"FAILED test_fail_extra_reporting.py::test_this: AssertionError: this_failedthis…",
|
"FAILED test_fail_extra_reporting.py::test_this: AssertionError: this_failedth...",
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue