V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
sdjl
V2EX  ›  Python

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

  •  
  •   sdjl · 2017-09-07 17:24:58 +08:00 · 3448 次点击
    这是一个创建于 2642 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在用 Python 的 unittest 模块写测试代码时,经常会有类似 self.assertEqual(xxx, '我') 这样的代码,当 assert 不通过时显示的提示是乱码,如:

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

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

    难道你们写测试代码的时候没有遇到这个问题么?
    11 条回复    2017-09-18 18:37:29 +08:00
    ipwx
        1
    ipwx  
       2017-09-07 17:25:46 +08:00
    测试代码用英文写 message 不就行了,搞这么蛋疼干嘛。
    bwangel
        2
    bwangel  
       2017-09-07 18:03:16 +08:00
    我用的 Django 的测试框架,终端是 Mac 下 Iterm2,能够正常显示中文。
    xiahei
        3
    xiahei  
       2017-09-07 18:06:10 +08:00 via Android
    都用 Unicode 不就好了。
    sdjl
        4
    sdjl  
    OP
       2017-09-07 18:22:14 +08:00
    @xiahei unicode 依然显示乱码
    xiahei
        5
    xiahei  
       2017-09-07 18:23:50 +08:00 via Android   ❤️ 2
    @sdjl 你可能不知道编码和乱码是什么东西
    sdjl
        6
    sdjl  
    OP
       2017-09-07 18:25:15 +08:00
    @xiahei 反正就是希望他显示中文,isinstance(xxx, unicode) == True,依然不是中文
    mdzz
        7
    mdzz  
       2017-09-07 18:29:35 +08:00
    assert CONDITION, MESSAGE
    NoAnyLove
        8
    NoAnyLove  
       2017-09-07 20:43:54 +08:00
    用的 Python 2 ?目测 Python 3 没问题,Python 2 需要手动转换成终端使用的字符集,或者文件编码使用和终端一样的文件编码
    guerbai
        9
    guerbai  
       2017-09-07 20:59:33 +08:00
    encode, decode 一番试试。
    sdjl
        10
    sdjl  
    OP
       2017-09-08 15:03:52 +08:00
    @guerbai decode 后是

    AssertionError: u'\u8001\u677f' != u'\u5458\u5de5'
    TimePPT
        11
    TimePPT  
       2017-09-18 18:37:29 +08:00
    @sdjl 猜测因为 unittest 的 Error message 默认使用了类似 repr()方法(也有可能有改写,具体没看)。
    实际上这样是安全的,因为你在做断言时候并不知道传进去的都是啥,repr()可以在打印时附带会显示类型。

    如果真要必须显示中文,思路有两个:
    1. 用 python3
    2. self.assertEqual 可传入的参数其实有 message,但默认 msg=None (参见文档),那在写测试用例是自定义一个 msg 就好
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2588 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 10:46 · PVG 18:46 · LAX 02:46 · JFK 05:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.