diff --git a/changelog/5479.bugfix.rst b/changelog/5479.bugfix.rst new file mode 100644 index 000000000..d1dd3b0f8 --- /dev/null +++ b/changelog/5479.bugfix.rst @@ -0,0 +1 @@ +Improve quoting in ``raises`` match failure message. diff --git a/src/_pytest/_code/code.py b/src/_pytest/_code/code.py index b0b4d6531..aa4dcffce 100644 --- a/src/_pytest/_code/code.py +++ b/src/_pytest/_code/code.py @@ -544,7 +544,7 @@ class ExceptionInfo: """ __tracebackhide__ = True if not re.search(regexp, str(self.value)): - assert 0, "Pattern '{!s}' not found in '{!s}'".format(regexp, self.value) + assert 0, "Pattern {!r} not found in {!r}".format(regexp, str(self.value)) return True diff --git a/testing/python/raises.py b/testing/python/raises.py index c9ede412a..ed3a5cd37 100644 --- a/testing/python/raises.py +++ b/testing/python/raises.py @@ -220,13 +220,20 @@ class TestRaises: int("asdf") msg = "with base 16" - expr = r"Pattern '{}' not found in 'invalid literal for int\(\) with base 10: 'asdf''".format( + expr = r"Pattern '{}' not found in \"invalid literal for int\(\) with base 10: 'asdf'\"".format( msg ) with pytest.raises(AssertionError, match=expr): with pytest.raises(ValueError, match=msg): int("asdf", base=10) + def test_match_failure_string_quoting(self): + with pytest.raises(AssertionError) as excinfo: + with pytest.raises(AssertionError, match="'foo"): + raise AssertionError("'bar") + msg, = excinfo.value.args + assert msg == 'Pattern "\'foo" not found in "\'bar"' + def test_raises_match_wrong_type(self): """Raising an exception with the wrong type and match= given.