Python 如何让 AssertionError 显示中文字符?

在用 Python 的 unittest 模块写测试代码时,经常会有类似 self.assertEqual(xxx, ‘我’) 这样的代码,当 assert 不通过时显示的提示是乱码,如:

Asserti onError: ‘\xe5\x91\x98\xe5\xb7\xa5’ != ‘\xe8\x80\x81\xe6\x9d\xbf’

请问如何让这里显示中文字符?

难道你们写测试代码的时候没有遇到这个问题么?
Python 如何让 AssertionError 显示中文字符?

12 回复

测试代码用英文写 message 不就行了,搞这么蛋疼干嘛。


# 设置默认编码为UTF-8
import sys
import io

# 方法1:设置标准输出的编码
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')

# 方法2:直接使用Unicode字符串
def test_assertion():
    value = 10
    # 使用u前缀确保字符串是Unicode(Python3中默认就是)
    assert value > 20, "数值必须大于20"  # 直接写中文
    
    # 或者使用format方式
    assert value > 20, f"当前数值{value}不符合大于20的要求"

if __name__ == "__main__":
    try:
        test_assertion()
    except AssertionError as e:
        print(f"断言错误: {e}")
        # 错误信息会正常显示中文

要让AssertionError显示中文,关键是要确保Python环境的编码设置正确。在Python 3中,字符串默认就是Unicode,所以直接写中文断言信息就行。

如果遇到乱码,通常是终端或IDE的编码问题。可以:

  1. 在代码开头设置标准输出的编码为UTF-8
  2. 确保你的.py文件本身保存为UTF-8编码
  3. 检查运行环境的编码设置

其实Python 3对中文支持已经很好了,我平时写断言都是直接写中文,从没出过问题。只要环境配置正确,显示中文完全没问题。

总结:直接写中文断言信息,确保环境编码正确。

我用的 Django 的测试框架,终端是 Mac 下 Iterm2,能够正常显示中文。

都用 Unicode 不就好了。

unicode 依然显示乱码

你可能不知道编码和乱码是什么东西

反正就是希望他显示中文,isinstance(xxx, unicode) == True,依然不是中文

assert CONDITION, MESSAGE

用的 Python 2 ?目测 Python 3 没问题,Python 2 需要手动转换成终端使用的字符集,或者文件编码使用和终端一样的文件编码

encode, decode 一番试试。

decode 后是

AssertionError: u’\u8001\u677f’ != u’\u5458\u5de5’

猜测因为 unittest 的 Error message 默认使用了类似 repr()方法(也有可能有改写,具体没看)。
实际上这样是安全的,因为你在做断言时候并不知道传进去的都是啥,repr()可以在打印时附带会显示类型。

如果真要必须显示中文,思路有两个:
1. 用 python3
2. self.assertEqual 可传入的参数其实有 message,但默认 msg=None (参见文档),那在写测试用例是自定义一个 msg 就好

回到顶部