NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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

  • 2009-12-04
  • 本文字数:1014 字

    阅读完需:约 3 分钟

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

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

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

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

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

我们在真实的时间服务上添加了一个抽象层(意思就是通过一个接口隐藏了对系统时间 API 的调用),然后在用测试脚本进行测试时替换掉该实现。默认情况下实现应该是可插拔的。 这么做的好处是可以确保每次运行时都能覆盖所有的测试情况,可用于测试时间的竞态条件( race conditions)。

来自 Software Development Coach George 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

2009-12-04 13:251527
用户头像

发布了 88 篇内容, 共 258.6 次阅读, 收获喜欢 8 次。

关注

评论

发布
暂无评论
发现更多内容

马士兵最新2020涵盖P5—P8Java全栈架构师学习路线,跟着老师学我已拿P7Offer!

Java架构追梦

Java 学习 架构 面试 马士兵

英特尔与南京溧水经济技术开发区共同成立智能交通研究院

E科讯

基于DAYU的实时作业开发,分分钟搭建企业个性化推荐平台

华为云开发者联盟

华为 算法 数据 dayu

如何用CSS实现图像替换链接文本显示并保证链接可点击

陈北

CSS小技巧

【薪火计划】05 - 坦诚是领导力的根基

AR7

管理

About Me

翎君

android

30分钟开发一款抓取网站图片资源的浏览器插件

徐小夕

Java chrome 大前端 chrome扩展

市值管理机器人、自动跑k线机器人开发

t13823115967

市值管理机器人 自动跑k线机器人开发

彻底搞懂 IO 底层原理

vivo互联网技术

Java Netty 服务器 语法

区块链应用场景有哪些?区块链应用开发

t13823115967

区块链应用场景有哪些 区块链应用开发

我是面试官,我来分享一波面经!看看我的内心OS

比伯

Java 编程 架构 面试 技术宅

视频作品播放量低:自媒体作者如何走出新手村

石头IT视角

双指针算法和位运算&离散化和区间合并

落曦

【JAVA】List转换为array

笑春风

大厂经验:埋点数据质量之埋点验证

阿亮

埋点 数据验证

在线K歌的发展和优势

anyRTC开发者

音视频 WebRTC RTC sdk

moon不讲武德!!!一个类加载机制给面试官说蒙了!!

moon聊技术

Java JVM 类加载 类加载器

如何基于App SDK快速地开发一个IoT App?

IoT云工坊

App 物联网 sdk 智能家居

第一周 架构方法 作业一 「架构师训练营 3 期」

胡云飞

极客大学架构师训练营 架构方法

MySQL如何实现万亿级数据存储?

冰河

MySQL 分布式 微服务 高可用 mycat

Python进阶——什么是元类?

Kaito

Python

面试专题-Java基础面试技术

洛神灬殇

LeetCode题解:169. 多数元素,分治,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

Appium上下文和H5测试(一)

清菡软件测试

App

面试JVM一问三不知??来看看这个

程序员的时光

JVM Java虚拟机

云原生应用Go语言:你还在考虑的时候,别人已经应用实践

华为云开发者联盟

微服务 云技术 Go 语言

申通快递 双11 云原生应用实践

阿里巴巴云原生

阿里云 Kubernetes 运维 云原生 监控

《华为数据之道》读书笔记:第 2 章 建立企业级数据综合治理体系

方志

数据中台 数据仓库 数字化转型 数据治理

架构师训练营第 1 期 - 第 9 周 - 学习总结

wgl

极客大学架构师训练营

甲方日常 56

句子

工作 随笔杂谈 日常

Web前端如何实现断点续传

QiLab

Web 断点续传 upload pl

如何对时间和日期进行系统与验收测试_研发效能_Mark Levison_InfoQ精选文章