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

2017-09-07 17:24:58 +08:00
 sdjl
在用 Python 的 unittest 模块写测试代码时,经常会有类似 self.assertEqual(xxx, '我') 这样的代码,当 assert 不通过时显示的提示是乱码,如:

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

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

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

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

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/388967

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX