如何单元测试验证日期时间的函数是否采用特定的ISO格式?

1 python datetime unit-testing

我是单元测试的新手,我想就这个主题提供一些指导.该函数验证日期时间是否为首先是字符串,如果是,则验证它是否是正确的ISO格式.

if not isinstance(timestamp,str):
    raise ValueError("timestamp must be a string")
try:
    datetime.strptime(timestamp, '%Y-%m-%dT%H:%M:%S')
    return True
except ValueError:
    return True
Run Code Online (Sandbox Code Playgroud)

如何确定单元测试中包含哪些内容以及我应该注意什么?

aba*_*ert 5

关键是提出边缘情况.这在很大程度上依赖于问题领域的经验 - 你在过去的日期中看到了什么错误.但幸运的是,您可以随时添加更多单元测试,以便在等待Lyft或其他任何内容时找到并修复错误或想到奇怪的情况.

有一些特别的事情需要注意日期时间 - 但请注意,其中许多,你首先必须决定你想做什么,然后才能测试你是否正在做你决定做的事情.

  • 当然,确保非字符串提升ValueError.包括bytes.
  • 单位数天和月 - 是2018-3-06有效日期吗?
  • 同样地,小时,分钟和秒(但有时您想要的规则是不同的).
  • 不同的分隔符 - 例如,2018-03-06 12:13:14是有效的ISO时间戳,但不适用于您的规则.与此相关20180306T12:13:14,以及许多其他变体.
  • 所有明显的过去 - 结束值,如第0或第13个月 - 但在下面看到奇怪的例外,如第二个60.
  • 过去时间戳太长,无法处理代码的其他部分.例如,ISO允许1960年的日期,但如果您的代码要将它们传递给处理uint32 Unix时间戳的API,那么就您而言,它们无效.
  • 0000年.根据ISO 8601,这意味着1 BCE,但您可能不希望如此.
  • 两位数的年份.一年,三年和五位数年份.负面年份和具有明确+前缀的年份.ISO 8601推荐像0030这样的四位数年份,但也建议允许+-前缀(这是处理公元前1年之前的唯一方法),并且通过信息交换中合作伙伴的协议,允许像10010这样的年份.
  • 分数秒.有人会通过你2018-06-20T15:16:17.890.
  • 时区/偏移指标.有人会通过你2018-06-20T15:16:17Z.
  • 2月29日闰年(包括2000年)和非闰年(包括1900年).
  • 闰秒 - 例如,2005-12-31T23:59:60UTC或2006-01-01T08:59:60日本本地.
  • 由于DST转换而不存在的小时数,如果您正在处理当地时间 - 例如,2018-03-11T02:30:00在美国大部分地区都不存在.
  • 由于日历转换而不存在的日子,如果你正在处理当地时间并关心过去 - 例如,英国1752年失踪的11天,1918年俄罗斯的13天等等.