BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

如何对时间和日期进行系统与验收测试

| 作者 Mark Levison 关注 0 他的粉丝 ,译者 张龙 关注 14 他的粉丝 发布于 2009年12月5日. 估计阅读时间: 3 分钟 | CNUTCon 了解国内外一线大厂50+智能运维最新实践案例。

Old Clock

人们经常探讨如何对时间和日期进行单元测试,因为我们无法在测试用例中使用绝对时间,否则即便测试通过,那也仅仅是针对该具体的日期通过而已。解决该问题的标准方式是采取由大佬Adam Sroka提出的依赖注入:

要想对大量日期进行测试需要对其进行计算,但执行计算的方法绝不可以自己获取这些日期,无论日期是“now”、来自于数据库还是用户输入。我们应该在一个较高层次上获取日期并对其进行计算。

对于单元测试来说这是小菜一碟,但问题是我们在验收与系统测试中应该如何做呢?Andreas Ebbert-Karroum对于该问题给出了3个解决方案:

  1. 在测试中,保证期望的结果也是取决于日期和时间的。
  2. 修改应用以保证其不会使用系统的当前时间而是使用时间服务,我们可以远程控制该服务以使用不同的时间而不是当前的系统时间
  3. 远程修改系统时间

xUnit Test Patterns一书的作者Gerard Meszaros使用了第二种方式(又名Virtual Clock Pattern):

我们在真实的时间服务上添加了一个抽象层(意思就是通过一个接口隐藏了对系统时间API的调用),然后在用测试脚本进行测试时替换掉该实现。默认情况下实现应该是可插拔的。

这么做的好处是可以确保每次运行时都能覆盖所有的测试情况,可用于测试时间的竞态条件( race conditions)。

来自Software Development CoachGeorge Dinwiddie说单独的时间源可以避免一些微妙的问题,运行在多个机器上的系统会有多个系统时间,比如说一台机器上的系统时间和另一台机器上的数据库时间等等。

Ward Cunnigham维基百科)采取了一种不同的方式:“在swim框架中,测试用例运行了几周。我们使用了一个全局变量$now来编写SQL,该表达式会在每次执行之前处理好时间问题,无论是小时、天还是周。这种方式对于SQL的跟踪非常有效”。

来自FitSharp的开发者Mike Stockdale指出这种方式支持相对日期的解析,比如today+2。FitLibrary的创建者Rick Mugridge说这种方式具有一个“一般意义上的日期生成DSL”,它考虑到了不同时区中(具有不同的格式)相对日期的选择问题。我们可以在月末选择日期,也可以在周一选择。这种方式广泛应用在预约系统中,在这类系统中未来日期的选择是个重要的议题,因此测试必须要利用系统中已有的数据(以及日期)。而测试自动化架构师 Martin Gijsen则使用ANTLR来解决该问题。

综上所述,Andreas提出的前两种方案都得到了广泛的应用。你使用哪种方式呢,其优缺点又各是什么呢?

查看英文原文:System/Acceptance Testing with Time and Dates

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT