专栏首页软件测试那些事动态测试数据让用例活起来-DBRider

动态测试数据让用例活起来-DBRider

之前介绍了在数据库测试时,可以通过@DateSet注解的方式将一些预定义的数据导入到目标数据库中,以实现对数据库上下文的控制。一般情况下,DBRider可以很好地完成这项工作。 而在某些测试场景中,则需要某些数据是需要动态生成的,例如ID、序列号、日期、时间等等。譬如在关于某个订单系统的测试时,系统只会处理当天的数据。而使用@ExportDataSet导出的数据,则会日期、时间等数据在导出后就不再变化了。这类数据如果是直接导入使用的话,可能会导致测试场景无法触发的问题。于是,一个很自然的需求就产生了 可否在导入数据时,能将日期字段的值替换为系统当前的日期?

或者一个更为宽泛的问题,如何能够让测试数据可以适应SUT的变化而动态地生成测试数据?当然这是一个比较大的题目,本文只是demo一个非常简单的关于时间的场景。

DBRider的 DataSet Replacers

@DBUnit(cacheConnection = true)
public class DateReplacementsIt {
    Calendar now;
    @Before
    public void setup(){
        now = Calendar.getInstance();
    }
    @Test
    @DataSet(value = "datasets/yml/date-replacements.yml",disableConstraints = true, executorId = "rules-it")
    public void shouldReplaceDateWithNowPlaceHolder() {
        Tweet tweet = (Tweet) EntityManagerProvider.em()
.createQuery("select t from Tweet t where t.id = '1'").getSingleResult();
        assertThat(tweet).isNotNull();
        assertThat(tweet.getDate().get(Calendar.DAY_OF_MONTH)).isEqualTo(now.get(Calendar.DAY_OF_MONTH));
        assertThat(tweet.getDate().get(Calendar.HOUR_OF_DAY)).isEqualTo(now.get(Calendar.HOUR_OF_DAY));
    }

通过上述用例来验证date-replacements.yml文件导入到数据库中的内容的确是当前月份和日期。那么来看一下date-replacements.yml文件。

TWEET:
  - ID: "1"
    CONTENT: "dbunit rules!"
    DATE: "[DAY,NOW]"
    USER_ID: 1
  - ID: "2"
    CONTENT: "dbunit rules!"
    DATE: "[DAY,YESTERDAY]"
    USER_ID: 1
  - ID: "4"
    CONTENT: "dbunit rules!"
    DATE: "[DAY,YEAR_AFTER]"
    USER_ID: 1
  - ID: "6"
    CONTENT: "dbunit rules!"
    DATE: "[HOUR,PLUS_ONE]"
    USER_ID: 1
  - ID: "7"
    CONTENT: "dbunit rules!"
    USER_ID: 1
    TIMESTAMP: "[UNIX_TIMESTAMP]"

DBRider提供了[DAY,NOW] 这样的占位符,用以替换时间类的字段值。从上述示例来看,不仅支持年、月、日、小时的当前值,还可以前后进行偏移,以及时间戳。

DBRider源码分析

DBRider通过提供Repalcer接口来支持动态数据替换的功能。原生提供了日期时间、Null和时间戳这三种类型。

image.png

以最简单的时间戳来看,

package com.github.database.rider.core.replacers;

import org.dbunit.dataset.ReplacementDataSet;

/**
 * Replacer which replaces [UNIX_TIMESTAMP] placeholder with Unix timestamp (obtained through {@link System#currentTimeMillis()}
 *
 * @author njuro
 */
public class UnixTimestampReplacer implements Replacer {

    @Override
    public void addReplacements(ReplacementDataSet dataSet) {
        long timestamp = System.currentTimeMillis() / 1000L;
        dataSet.addReplacementObject("[UNIX_TIMESTAMP]", timestamp);
    }
}

读者可以参考上述案例来实现自己的CustomReplacer

本文分享自微信公众号 - 软件测试那些事(antony-not-available),作者:风月同天测试人

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-09-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 数据库断言的8种姿势-基于DBRider

    我们将使用DataBaseRider提供的 @ExpectedDataSet注解来实现上述需求。

    Antony
  • 规则引擎Easy-Rule极简入门

    Easy-Rule是一个轻量级的规则引擎,也非常容易上手。有了它,“满100减30,满200减60,最高减免xxx”, 程序员就不会因为规则实现错误公司被薅羊毛...

    Antony
  • SonarQube升级踩坑记录

    目前使用的是SonarQube 6.7,已经有超过100个项目在使用。近期开发同学反馈,IDEA+SonarLint结合使用非常好用,可以在代码编写和问题产生的...

    Antony
  • 一个岗位收到几百份简历,如何提升自己的市场竞争力?

    The more things change, the more important it is to know the underlying principl...

    哲洛不闹
  • Python3爬虫实战(一):新闻标题及其URL

    本文以'链节点'网站为例,实现新闻标题及其URL批量获取,并以字典的形式存入本地。

    用户5473628
  • 史上最受欢迎的十大TED演讲

    http://open.163.com/movie/2014/3/7/P/M9KC3BQ57_M9KEPUR7P.html

    华章科技
  • 什么是CPQ,以及为什么要选择Salesforce

    配置,价格,报价(Configure, Price, Quote),或称为CPQ,是帮助公司定义大量和不断变化变量的产品价格的软件。CPQ软件汇合这些变量,反过...

    臭豆腐
  • 小程序开发的与众不同

    注意:域名只支持https,不能使用IP或者localhost,域名必须经过ICP备案,每个接口最多设置20个域名。

    用户3258338
  • 春秋夺旗赛第二季WEB部分题解

    很明显,是一个反序列化的题目,很简单,绕过__wakeup函数,然后使得file=flag.php即可

    安恒网络空间安全讲武堂
  • MongoDB 日志太大怎么办 清理? 原

    MongoDB的日志增长的很快,/var所在的空间马上就占满了,即便换到另一个磁盘分区保存日志,日志还是增长的很快,磁盘眼看要告磬。

    拓荒者

扫码关注云+社区

领取腾讯云代金券