diff --git a/_pytest/runner.py b/_pytest/runner.py index 4f66aa97d..cde94c8c8 100644 --- a/_pytest/runner.py +++ b/_pytest/runner.py @@ -435,7 +435,10 @@ class OutcomeException(Exception): def __repr__(self): if self.msg: - return py._builtin._totext(self.msg) + val = self.msg + if isinstance(val, bytes): + val = py._builtin._totext(val, errors='replace') + return val return "<%s instance>" %(self.__class__.__name__,) __str__ = __repr__ diff --git a/testing/test_runner.py b/testing/test_runner.py index bfa8fc77f..4421c5d0d 100644 --- a/testing/test_runner.py +++ b/testing/test_runner.py @@ -440,16 +440,19 @@ def test_pytest_fail_notrace(testdir): assert 'def teardown_function' not in result.stdout.str() -def test_pytest_fail_notrace_unicode(testdir): +@pytest.mark.parametrize('str_prefix', ['u', '']) +def test_pytest_fail_notrace_non_ascii(testdir, str_prefix): """Fix pytest.fail with pytrace=False with non-ascii characters (#1178). + + This tests with native and unicode strings containing non-ascii chars. """ testdir.makepyfile(u""" # coding: utf-8 import pytest def test_hello(): - pytest.fail(u'oh oh: ☺', pytrace=False) - """) + pytest.fail(%s'oh oh: ☺', pytrace=False) + """ % str_prefix) result = testdir.runpytest() if sys.version_info[0] >= 3: result.stdout.fnmatch_lines(['*test_hello*', "oh oh: ☺"])