Python单元测试出现UnicodeEncodeError内部错误,求排查方向
问题分析:unittest测试中tearDown阶段的UnicodeEncodeError错误
问题描述
编写了一个包含JSON文件读取逻辑的Python测试用例,单独读取文件无异常,但使用unittest.TestCase执行测试时出现内部错误。错误栈未指向业务代码,已将JSON文件读取编码改为UTF-8仍报错,测试用例本身可正常通过,调试发现错误发生在tearDown()执行期间/之后。
错误日志
INTERNALERROR> self.message('testStdErr', name=testName, out=out, flowId=flowId) INTERNALERROR> File "C:\Program Files\JetBrains\PyCharm Community Edition 2022.3.1\plugins\python-ce\helpers\pycharm\_jb_runner_tools.py", line 117, in message INTERNALERROR> _old_service_messages.message(self, messageName, **properties) INTERNALERROR> File "C:\Program Files\JetBrains\PyCharm Community Edition 2022.3.1\plugins\python-ce\helpers\pycharm\teamcity\messages.py", line 101, in message INTERNALERROR> retry_on_EAGAIN(self.output.write)(self.encode(message)) INTERNALERROR> File "C:\Program Files\JetBrains\PyCharm Community Edition 2022.3.1\plugins\python-ce\helpers\pycharm\teamcity\messages.py", line 68, in encode INTERNALERROR> value = value.encode(self.encoding) INTERNALERROR> File "C:\Users\myuser\Anaconda3\envs\myrepo\lib\encodings\cp1252.py", line 12, in encode INTERNALERROR> return codecs.charmap_encode(input,errors,encoding_table) INTERNALERROR> UnicodeEncodeError: 'charmap' codec can't encode characters in position 524-533: character maps to <undefined>
错误原因
本质是编码不匹配:PyCharm的测试 runner 默认使用Windows控制台编码(cp1252)输出测试相关信息,但测试过程中产生了cp1252无法编码的Unicode字符(如中文、特殊符号等),这些字符被测试框架捕获后,在tearDown阶段生成测试报告/输出日志时触发编码失败。
排查与解决方向
- 检查测试用例中所有输出内容:包括
print语句、日志输出、断言的错误信息(即便测试通过,框架可能仍会记录上下文),确认是否包含非cp1252兼容的字符 - 检查
tearDown()方法逻辑:是否存在打印日志、输出测试数据(如读取的JSON中的特殊字符)、或清理操作时的输出内容 - 修改PyCharm编码设置:进入
File > Settings > Build, Execution, Deployment > Console > Python Console,将编码改为UTF-8;同时在测试运行配置中添加环境变量PYTHONIOENCODING=utf-8 - 强制设置系统输出编码:在测试代码开头添加以下代码,确保输出流使用UTF-8编码
import sys sys.stdout.reconfigure(encoding='utf-8') sys.stderr.reconfigure(encoding='utf-8') - 检查JSON文件内容:确认JSON中的特殊字符是否在测试过程中被输出到控制台,即便读取时用了UTF-8,输出环节仍可能触发编码问题
内容的提问来源于stack exchange,提问作者Ruslan
相关产品推荐
相关产品推荐

