阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

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

  • 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:251523
用户头像

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

关注

评论

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

关于广东欢太科技可不可信?那是你还不了解

Geek_4a453c

企业 欢太 欢太科技

硬核!一文学完Flink流计算常用算子(Flink算子大全)

五分钟学大数据

大数据 flink 28天写作 3月日更

细粒度授权在安全领域的重要性

龙归科技

安全 iam 细粒度 ABAC PBAC

算法喜刷刷之验证二叉树的前序序列化

Kylin

算法 3月日更 刷题笔记

《精通比特币》学习笔记(第八章)

棉花糖

区块链 学习 3月日更

“新作者 新入驻 新征程”第一季获奖名单

InfoQ写作社区官方

热门活动

2月大事件:度目CM-Mini智能面板机全新发布,飞桨PaddleGAN“复活”李焕英

百度大脑

百度 百度大脑

这是看脸的时代吗——晕轮效应

Justin

心理学 28天写作 游戏设计

真·“拜师学艺”?2021中科院开源之夏,开源大牛1V1&万元奖金只等你来!

京东科技开发者

开源 开源社区

华云大咖说 | 华云数据与瀚高软件携手共建国产云生态 助力政企用户安全可靠发展

华云数据

微服务简介

insight

微服务 3月日更

一步一步教你如何在Centos7中配置Kafka运行时环境

happlyfox

28天写作 3月日更

翻译:《实用的Python编程》05_01_Dicts_revisited

codists

Python

带你了解VXLAN网络中报文的转发机制

华为云开发者联盟

网络 网关 VXLAN 报文 分布式网关

力扣(LeetCode)刷题,简单题(第27期)

不脱发的程序猿

面试 LeetCode 28天写作 算法面经 3月日更

物联网常用协议:MQTT、CoAP、LwM2M、HTTP、LoRaWAN和NB-IoT

不脱发的程序猿

物联网 通信协议 28天写作 3月日更 物联网常用协议

Python With 关键字和语句

HoneyMoose

滚雪球学 Python 之闭包操作,本系列第 8 篇文章

梦想橡皮擦

28天写作 3月日更

《未来世界的幸存者》读书笔记

SilentMacUser

极客时间 互联网 技术学习 阅读 阮一峰

一起来学习LiteOS中断模块的源代码

华为云开发者联盟

代码 华为云 LiteOS 中断 中断控制器

3月12日学习笔记

Nydia

聊聊什么是CommonJs和Es Module及它们的区别

蛙人

大前端 js ES6

【LeetCode】验证二叉树的前序序列化Java题解

Albert

算法 LeetCode 28天写作 3月日更

(28DW-S8-Day20) 以太坊账户

mtfelix

28天写作

如何成为一名架构师?

xcbeyond

程序人生 方法论 架构师 成长与思考 3月日更

植树节,种个二叉树吧?

悟空聊架构

数据结构 算法 二叉树

区块链应用解决方案赋能到农产品溯源上究竟能解决什么问题?

源中瑞-龙先生

你以为在做的是微服务?不!你只是做了个比单体还糟糕的分布式单体!

程序猿DD

微服务

对标阿里P9Java架构师面试题,已助我拿下字节、蚂蚁、滴滴三家Offer

Java架构追梦

Java 阿里巴巴 架构 面试 滴滴

“种”下黑科技,守护每株绿,“植”了!

华为云开发者联盟

华为 AI IoT modelarts 森林

ECMAScript 2016(ES7)新特性简介

程序那些事

JavaScript ecmascript ES6 程序那些事 es7

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