Pytest处理带重音字符字符串字面量异常的解决方案
pytest运行含非ASCII字符字符串断言长度异常问题
问题复现
直接在Python 3.8.10环境运行如下代码时,所有断言正常通过:
assert len("mas") == 3 assert len("más") == 3
将相同代码写入pytest测试用例后,代码如下:
# -*- coding: utf-8 -*- def test_my_bug(): assert len("mas") == 3 assert len("más") == 3
第二条断言执行失败,pytest判定"más"的长度为4,属于字节与Unicode码点混淆导致的异常,但相同代码在原生Python环境运行完全正常。
- 虽然切换到Python内置的unittest框架可以绕过该问题,但pytest的简洁语法更符合使用习惯。
- 如果删除测试文件头部的
utf-8编码声明行,程序会直接抛出严重错误,属于明显的异常信号。 - 实际业务场景中有数十处需要在测试代码中传入字符串字面量,交由被测业务代码执行子串截取操作,核心需求是保证测试代码中的字符串字面量被正确构造,且业务涉及西班牙语内容,重音符号无法规避。
问题根因与解决
问题更新:此前排查时仅确认了Python版本,未核对pytest版本。
最终确认问题由pytest版本过旧导致:Ubuntu默认软件源安装的pytest版本为4.6.9,版本滞后幅度较大,存在Unicode字符串解析的相关bug。将pytest升级到7.1.2及以上较新版本后,测试即可正常运行,问题已解决。
升级pytest可直接执行如下命令:
pip install --upgrade pytest
建议在虚拟环境中安装新版pytest,避免修改系统全局依赖引发其他兼容性问题。
内容的提问来源于stack exchange,提问作者Michael Kenniston
相关产品推荐
相关产品推荐

