针对时间相关测试数据的正确方法(或测试数据逐渐变得陈旧)

时间:2014-03-21 22:24:38

标签: python unit-testing tdd

我决定在我的项目中使用TDD方法。首先,我将重点放在用例的一小部分上: 验证AccessCode。
AccessCode是Julian格式的日期,如果它小于或等于今天,则有效。

第1步:编写测试

def test_should_validate_accessdate(self):
    assert application.is_accessdate_valid(56746)

第2步:运行失败
完成。

第3步:让测试通过 在application.py中,

def is_accessdate_valid(accessdate):
    return True

第4步:运行传递
完成。

第5步:重构
没有什么可以重构的。但是,硬编码的返回值很糟糕。

现在,重复:
第1步:编写新测试

def test_should_invalidate_accessdate(self):
    assert not application.is_accessdate_valid(54990)

第2步:运行失败
完成。

第3步:让测试通过 在这种情况下,硬编码的返回值是一种痛苦。所以,我需要删除它,而不是概括一些逻辑让测试通过。

def is_accessdate_valid(accessdate):
    today_julian = julian_to_julian5(calendar_to_julian(datetime.utcnow()))
    return accessdate >= today_julian

我不确定我是否做了正确的事情,只需一步迈出这么大的一步。但是,我没有看到任何其他方法使测试通过而不会失败其他测试。 欢迎提出建议。

第4步:运行以通过测试
完成。

步骤5:运行以通过所有测试
完成。

最初,我很自豪我能够通过首先为它编写测试来定义函数,然后通过更多的测试来对其进行整形。 但是,后来我意识到,检查有效访问日期的测试将在今天的日期越过输入accessdoday的日期后开始失败。 我能做的一件事是提供一个动态计算的输入访问日期:
1.在今天的日期添加一两天 2.将上述结果日期转换为朱利安格式 3.使用上面的Julian结果作为输入访问日期。

然而,有些事情感觉不对。

我是否走在正确的道路上? 还是我在某个地方误入歧途? 或者首先是功能设计错误,假设我应该选择不同的签名?

欢迎任何建议或抨击。

1 个答案:

答案 0 :(得分:2)

您不想编写与时间相关的单元测试。因此,编写相对于作为参数的日期的测试 - 因此保持不变 - 或者使用jonrsharpe提到的模拟方法。这使您只能确定用于确定时间相关组件的机制是否有效,而不是逻辑是否有效。

这也适用于其他环境事物 - 机器名称,目录路径名,历史股票价格等。