让测试数据“时间穿梭”

发表于:2019-9-10 19:38

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Boris    来源:搜狗测试

  背景
  最近小编在项目新版本的测试时发现,因项目需求,代码中很多触发器和校验都是与时间相关的,虽然在单元测试层面我们可以直接调用一些现成的库实现变量化的时间,但在端对端测试时与时间相关的测试数据构造较为繁琐,占用了大量的时间,尤其是小编的项目将服务器放在了云端,用户端行不通,在服务端修改系统时钟也行不通,那么在端对端的测试上,测试的覆盖、结果不可控就成为了主要的问题。针对这些问题,小编进行了一定的调研解决,在这里与大家分享一下。
  问题
  假设我们有一组测试数据,我们需要按照数据中的用户年龄属性对这批数据进行分组(用户还可能包含很多其它属性),针对不同的组别,代码有不同的处理逻辑。那么问题来了:因为测试数据是死的,如果用户A当前进入了分支1,那么在测试数据不变的情况下, 服务端时间变更,用户A可能在下一秒就进入了分支B,那么这样的结果我们是无法进行断言的,也就是测试结果不可控。
  一般来说,有两种解决方案:
  ①编写修改测试环境的脚本,保证测试环境时间固定。
  ②将测试数据自动调整到我们想要的时间,针对上面的问题,就是测试数据时间能够随着测试环境的时间同步变动。
  分析上面的选项,必然是第二种情况对测试人员来说更为理想,因为在第一种方案下,如果服务器在云端,是难以修改系统时间的;即使能够修改成功,也会影响在此环境下的并行任务的测试。
  让测试数据“时间穿梭”
  如何让测试数据实现穿越功能呢,经过调研,我们采用了Testdate这一工具,并在此基础上进行了一定的改编,下面是一例子:
  首先安装Testdate
 yarn global add @endarn/testdate
  假设我们的测试数据组dataset.testdate.json如下格式:
   {
  "ageString": "__TESTDATE_now-0030-07-14_TESTDATE__",
  "ageEpoch": "__TESTDATE_now-0030-07-14#X%1_TESTDATE__"
  }
  接着运行Testdate,假设今天是2019年8月28日
   testdate --source 'dataset.testdate.json' \
  --destination 'dataset.evolved.json' \
  --format LLLL
  输出后的dataset.evolved.json如下:
   {
  "ageString": "Wednesday, August 28, 2019 3:16 PM",
  "ageEpoch": 586444596
  }
  testdate解析–source文件的关键字,通过固定的格式将输出重定向至–destination。文件不仅包括json,比如txt, csv等常用类型都是支持的。最终实现让测试数据与服务器时间保持同步。
  改编与改造
  在实际使用中,Testdate虽然节省了相对时间的测试数据的构造,但是针对固定时间仍需要单独写入测试数据中,虽然工作量不大,但仍是两步操作不能一气呵成,所以拿出源码,我们进行了一定的改造:
  如图所示,核心代码是muteTime这个函数,将函数中增加了是否为固定时间的判断,如果是固定时间,则设置为配置的固定时间即可,最后将配置写在下面的方法中:
  这样简单的改造,就完成了我们“一气呵成”构造时间相关测试数据的需求。
  总结
  本文分享了小编在项目测试过程中遇到的一个小问题,这个问题从发现到解决经历了问题定位、问题分析、方案调研、方案评估、方案实现、改造调优、总结的过程。这个过程是小编在工作中遇到大部分问题时要走的一套流程,有了一套通用的方案方法,才能娴熟地解决各类问题,不至于焦头烂额。希望本文对各位能够有所裨益。

      上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号