Add 'assert_truncate_level' to show the full diff without -vv

Closes #3962

Co-authored-by: Daniel Hahler <github@thequod.de>
This commit is contained in:
Pierre Sassoulas 2022-12-14 10:03:00 +01:00
parent 0ded3297a9
commit 99451f99d4
5 changed files with 34 additions and 3 deletions

View File

@ -0,0 +1 @@
``assert_truncate_level`` option added to be able to get the full diff without using ``-vv``.

View File

@ -270,6 +270,10 @@ situations, for example you are shown even fixtures that start with ``_`` if you
Using higher verbosity levels (``-vvv``, ``-vvvv``, ...) is supported, but has no effect in pytest itself at the moment, Using higher verbosity levels (``-vvv``, ``-vvvv``, ...) is supported, but has no effect in pytest itself at the moment,
however some plugins might make use of higher verbosity. however some plugins might make use of higher verbosity.
By default for verbosity inferior to ``-vv`` really long output are truncated. It's also possible to
control the truncation directly using the ``assert_truncate_level`` option. You can use ``assert_truncate_level=0``
to get the full diff regardless of the verbosity level.
.. _`pytest.detailed_failed_tests_usage`: .. _`pytest.detailed_failed_tests_usage`:
Producing a detailed summary report Producing a detailed summary report

View File

@ -25,9 +25,12 @@ def truncate_if_required(
def _should_truncate_item(item: Item) -> bool: def _should_truncate_item(item: Item) -> bool:
"""Whether or not this test item is eligible for truncation.""" """Whether this test item is eligible for truncation."""
level = item.config.getini("assert_truncate_level")
verbose = item.config.option.verbose verbose = item.config.option.verbose
return verbose < 2 and not util.running_on_ci() if level == "auto":
return verbose < 2 and not util.running_on_ci()
return bool(int(level) > verbose)
def _truncate_explanation( def _truncate_explanation(

View File

@ -256,6 +256,17 @@ def pytest_addoption(parser: Parser) -> None:
default="progress", default="progress",
) )
# Experimental.
parser.addini(
"assert_truncate_level",
help=(
"Truncate explanations of assertion failures? "
'("auto" (when verbosity < 2, and not running on CI), '
"or minimum verbosity level to trigger it (i.e. 0 for no truncation)."
),
default="auto",
)
def pytest_configure(config: Config) -> None: def pytest_configure(config: Config) -> None:
reporter = TerminalReporter(config, sys.stdout) reporter = TerminalReporter(config, sys.stdout)

View File

@ -1290,6 +1290,16 @@ class TestTruncateExplanation:
] ]
) )
# test assert_truncate_level ini option.
result = pytester.runpytest("-o", "assert_truncate_level=1")
result.stdout.fnmatch_lines(
["E ...Full output truncated (2 lines hidden), use '-vv' to show"]
)
result = pytester.runpytest("-o", "assert_truncate_level=0")
result.stdout.fnmatch_lines(["* 6*"])
result = pytester.runpytest("-v", "-o", "assert_truncate_level=0")
result.stdout.fnmatch_lines(["* 6*"])
result = pytester.runpytest("-vv") result = pytester.runpytest("-vv")
result.stdout.fnmatch_lines(["* 6*"]) result.stdout.fnmatch_lines(["* 6*"])
@ -1689,7 +1699,9 @@ def test_raise_assertion_error_raising_repr(pytester: Pytester) -> None:
""" """
) )
result = pytester.runpytest() result = pytester.runpytest()
result.stdout.fnmatch_lines(["E AssertionError: <exception str() failed>"]) result.stdout.fnmatch_lines(
["E AssertionError: <unprintable AssertionError object>"]
)
def test_issue_1944(pytester: Pytester) -> None: def test_issue_1944(pytester: Pytester) -> None: