diff --git a/changelog/5936.feature.rst b/changelog/5936.feature.rst new file mode 100644 index 000000000..c5cd924bb --- /dev/null +++ b/changelog/5936.feature.rst @@ -0,0 +1 @@ +Display untruncated assertion message with ``-vv``. diff --git a/src/_pytest/assertion/util.py b/src/_pytest/assertion/util.py index 0350b0b07..ce29553d5 100644 --- a/src/_pytest/assertion/util.py +++ b/src/_pytest/assertion/util.py @@ -7,6 +7,7 @@ from typing import Optional import _pytest._code from _pytest import outcomes +from _pytest._io.saferepr import safeformat from _pytest._io.saferepr import saferepr from _pytest.compat import ATTRS_EQ_FIELD @@ -123,13 +124,21 @@ def isiterable(obj): def assertrepr_compare(config, op, left, right): """Return specialised explanations for some operators/operands""" - maxsize = (80 - 15 - len(op) - 2) // 2 # 15 chars indentation, 1 space around op - left_repr = saferepr(left, maxsize=maxsize) - right_repr = saferepr(right, maxsize=maxsize) + verbose = config.getoption("verbose") + if verbose > 1: + left_repr = safeformat(left) + right_repr = safeformat(right) + else: + # XXX: "15 chars indentation" is wrong + # ("E AssertionError: assert "); should use term width. + maxsize = ( + 80 - 15 - len(op) - 2 + ) // 2 # 15 chars indentation, 1 space around op + left_repr = saferepr(left, maxsize=maxsize) + right_repr = saferepr(right, maxsize=maxsize) summary = "{} {} {}".format(left_repr, op, right_repr) - verbose = config.getoption("verbose") explanation = None try: if op == "==": diff --git a/testing/test_assertrewrite.py b/testing/test_assertrewrite.py index 470c54145..3555d8252 100644 --- a/testing/test_assertrewrite.py +++ b/testing/test_assertrewrite.py @@ -190,11 +190,12 @@ class TestAssertionRewrite: pass msg = getmsg(f, {"cls": X}).splitlines() - if verbose > 0: - + if verbose > 1: + assert msg == ["assert {!r} == 42".format(X), " -{!r}".format(X), " +42"] + elif verbose > 0: assert msg == [ "assert .X'> == 42", - " -.X'>", + " -{!r}".format(X), " +42", ] else: @@ -206,9 +207,17 @@ class TestAssertionRewrite: def f(): assert "1234567890" * 5 + "A" == "1234567890" * 5 + "B" - assert getmsg(f).splitlines()[0] == ( - "assert '123456789012...901234567890A' == '123456789012...901234567890B'" - ) + msg = getmsg(f).splitlines()[0] + if request.config.getoption("verbose") > 1: + assert msg == ( + "assert '12345678901234567890123456789012345678901234567890A' " + "== '12345678901234567890123456789012345678901234567890B'" + ) + else: + assert msg == ( + "assert '123456789012...901234567890A' " + "== '123456789012...901234567890B'" + ) def test_dont_rewrite_if_hasattr_fails(self, request): class Y: