pytest测试中datetime与带T的ISO时间字符串断言失败问题
解决方案
错误原因
- 第一次报错核心是类型不匹配:等号左侧为
datetime类型对象,右侧为ISO格式的字符串,不同类型数据直接对比必然不相等 - 第二次报错核心是格式不匹配:直接调用
str()转换datetime对象时,默认生成的字符串用空格做日期和时间的分隔符,而右侧ISO格式字符串用T做分隔符,两者格式不一致
修复方案
方案1:统一转换为datetime类型对比(优先推荐)
该方案可以完全避免字符串格式差异带来的问题,是时间对比的最优选择:
from datetime import datetime # 将字符串类型的预期值解析为datetime对象 expected_duration = datetime.fromisoformat(start_model_duration) assert model_setup.start_model_duration == expected_duration
若使用Python 3.7以下版本,不支持
fromisoformat方法,可以用strptime指定格式解析:expected_duration = datetime.strptime(start_model_duration, "%Y-%m-%dT%H:%M:%S")
方案2:统一转换为同格式字符串对比
如果业务场景需要用字符串形式对比,主动指定统一的格式化规则,不要依赖默认的str()转换:
# 将datetime对象格式化为带T的标准ISO字符串 actual_duration_str = model_setup.start_model_duration.isoformat() assert actual_duration_str == start_model_duration
也可以调整预期值的格式匹配实际输出:
expected_duration_str = start_model_duration.replace("T", " ") assert str(model_setup.start_model_duration) == expected_duration_str
进阶优化
如果需要忽略时间精度差异(比如毫秒、秒级误差),可以指定格式化精度:
# 仅对比到分钟级别 assert model_setup.start_model_duration.strftime("%Y-%m-%d %H:%M") == expected_duration.strftime("%Y-%m-%d %H:%M")
内容的提问来源于stack exchange,提问作者Akilesh
相关产品推荐
相关产品推荐

