diff --git a/CHANGELOG b/CHANGELOG index b3e4010ee..83f63601c 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -13,6 +13,8 @@ Unreleased at the beginning of strings and even that is deprecated. Use "not" instead. This should allow to pick parametrized tests where "-" appeared in the parameter. +- fix issue604: Escape % character in the assertion message. + 2.6.3 ----------- diff --git a/_pytest/assertion/rewrite.py b/_pytest/assertion/rewrite.py index 18df7791e..57edcd487 100644 --- a/_pytest/assertion/rewrite.py +++ b/_pytest/assertion/rewrite.py @@ -373,7 +373,7 @@ def _format_assertmsg(obj): t = py.builtin.text else: t = py.builtin.bytes - s = s.replace(t("\n"), t("\n~")) + s = s.replace(t("\n"), t("\n~")).replace(t("%"), t("%%")) if is_repr: s = s.replace(t("\\n"), t("\n~")) return s diff --git a/testing/test_assertrewrite.py b/testing/test_assertrewrite.py index 9d69b5f49..225608281 100644 --- a/testing/test_assertrewrite.py +++ b/testing/test_assertrewrite.py @@ -172,6 +172,18 @@ class TestAssertionRewrite: "*assert 1 == 2*", ]) + def test_assertion_message_escape(self, testdir): + testdir.makepyfile(""" + def test_foo(): + assert 1 == 2, 'To be escaped: %' + """) + result = testdir.runpytest() + assert result.ret == 1 + result.stdout.fnmatch_lines([ + "*AssertionError: To be escaped: %", + "*assert 1 == 2", + ]) + def test_boolop(self): def f(): f = g = False