python - 如何对验证日期时间是否为特定 ISO 格式的函数进行单元测试?

标签 python unit-testing datetime

我是单元测试的新手,我希望获得有关此主题的一些指导。该函数首先验证日期时间是否为字符串,如果是,则验证它是否采用正确的 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

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

最佳答案

关键是想出边缘案例。这在很大程度上取决于问题领域的经验——您过去在处理日期时间时遇到过哪些错误。但幸运的是,在等待 Lyft 或其他任何东西时,您总是可以在发现和修复错误或想到奇怪的情况时添加更多单元测试。

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

  • 当然要确保非字符串引发 ValueError。包括字节
  • 个位数的日期和月份——2018-3-06 是有效日期吗?
  • 对于小时、分钟和秒也是如此(但有时您想要的规则会有所不同)。
  • 不同的分隔符——例如,2018-03-06 12:13:14 是有效的 ISO 时间戳,但根据您的规则无效。同样,就此而言,20180306T12:13:14 和许多其他变体。
  • 所有明显的尾后值,例如第 0 个月或第 13 个月,但请参阅下文以了解奇怪的异常(exception)情况,例如第 60 个月。
  • 时间戳过去太久,代码的其他部分无法处理。例如,ISO 允许使用 1960 年的日期,但如果您的代码要将它们传递给处理 uint32 Unix 时间戳的 API,那么就您而言它们是无效的。
  • 0000 年。根据 ISO 8601,这意味着公元前 1 年,但您可能不希望这样。
  • 两位数年份。以及一位数、三位数和五位数的年份。以及负数年份,以及带有显式 + 前缀的年份。 ISO 8601 建议像 0030 这样的四位数年份,但也建议允许使用 +- 前缀(这是处理公元前 1 年之前的唯一方法),并允许像这样的年份10010 "通常由合作伙伴在信息交换中达成协议(protocol)。
  • 小数秒。有人会传给你 2018-06-20T15:16:17.890
  • 时区/时差指标。有人会通过你 2018-06-20T15:16:17Z
  • 闰年(包括 2000 年)和非闰年(包括 1900 年)2 月 29 日。
  • 闰秒——例如,2005-12-31T23:59:60 UTC 或 2006-01-01T08:59:60 日本本地时间。
  • 由于 DST 转换而不存在的时间,如果您处理的是本地时间,例如,2018-03-11T02:30:00 在美国大部分地区不存在。
  • 由于日历转换而不存在的日子,如果您处理的是本地时间并且关心过去——例如,英国 1752 年缺失的 11 天,俄罗斯 1918 年缺失的 13 天,等等。

关于python - 如何对验证日期时间是否为特定 ISO 格式的函数进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51792216/

相关文章:

python - Pandas 中的递归 SQL CTE 查询?

python - Python 的正则表达式模式

python - Django 不区分大小写 "distinct"查询

unit-testing - 从 TestServer 测试 asp.net 5 vnext 中间件

unit-testing - 您如何测试自己编写的代码?

json - 在 Flutter 中解析 JSON 日期

python - 使用 Python Scrapy 时的 HTTP 403 响应

php - 在 Codeception 中为单元测试套件添加自定义 Helper 方法的正确方法是什么?

ios - 以毫秒为单位转换 DateTime iOS

sql - 从日期时间 x 分钟前和日期时间 x 分钟前之间的 mysql 表中选择