diff --git a/_pytest/warnings.py b/_pytest/warnings.py index 926b1f58112..4a4b6e687c0 100644 --- a/_pytest/warnings.py +++ b/_pytest/warnings.py @@ -72,8 +72,8 @@ def catch_warnings_for_item(item): unicode_warning = False if compat._PY2 and any(isinstance(m, compat.UNICODE_TYPES) for m in warn_msg.args): - new_args = [compat.safe_str(m) for m in warn_msg.args] - unicode_warning = warn_msg.args != new_args + new_args = [m.encode('ascii', 'replace') for m in warn_msg.args] + unicode_warning = list(warn_msg.args) != new_args warn_msg.args = new_args msg = warnings.formatwarning( diff --git a/changelog/2809.bugfix b/changelog/2809.bugfix new file mode 100644 index 00000000000..bc6e503fb49 --- /dev/null +++ b/changelog/2809.bugfix @@ -0,0 +1 @@ +Pytest no longer complains about warnings with unicode messages being non-ascii compatible even for ascii-compatible messages. \ No newline at end of file diff --git a/testing/test_warnings.py b/testing/test_warnings.py index 1328cc3f2b8..fea3959f9e8 100644 --- a/testing/test_warnings.py +++ b/testing/test_warnings.py @@ -163,13 +163,33 @@ def test_func(fix): result.stdout.fnmatch_lines([ '*== %s ==*' % WARNINGS_SUMMARY_HEADER, - '*test_py2_unicode.py:8: UserWarning: \u6d4b\u8bd5', + '*test_py2_unicode.py:8: UserWarning: ??', '*warnings.warn(u"\u6d4b\u8bd5")', '*warnings.py:*: UnicodeWarning: Warning is using unicode non*', '* 1 passed, 2 warnings*', ]) +def test_py2_unicode_ascii(testdir): + """Ensure that our warning about 'unicode warnings containing non-ascii messages' + does not trigger with ascii-convertible messages""" + testdir.makeini('[pytest]') + testdir.makepyfile(''' + import pytest + import warnings + + @pytest.mark.filterwarnings('always') + def test_func(): + warnings.warn(u"hello") + ''') + result = testdir.runpytest() + result.stdout.fnmatch_lines([ + '*== %s ==*' % WARNINGS_SUMMARY_HEADER, + '*warnings.warn(u"hello")', + '* 1 passed, 1 warnings in*' + ]) + + def test_works_with_filterwarnings(testdir): """Ensure our warnings capture does not mess with pre-installed filters (#2430).""" testdir.makepyfile('''