Reactor Core实现了Reactive Streams规范,并处理了(可能无限的)数据流。 如果您感兴趣,请查看它提供的出色文档 。 在这里,我假设对Reactor Core库的Flux和Mono类型有一些基本的了解,并且将介绍Reactor Core提供了对时间本身的抽象,从而可以测试依赖于时间的函数。

对于某些Reactor核心运营商来说,时间是一个重要的考虑因素-例如,“间隔”功能的一种变体,它在初始“延迟” 10秒后每5秒发出一个递增的数字:

val flux = Flux.interval(Duration.ofSeconds(10), Duration.ofSeconds(5)).take(3)

根据正常时间流逝测试这样的数据流将是可怕的,这样的测试大约需要20秒才能完成。

Reactor-Core提供了一种解决方案,一种对时间本身的抽象-基于虚拟时间的调度程序,它提供了一种确定性的方式来测试这些类型的操作的巧妙方法。

让我以两种方式展示它,一种明确的方式应该使基于虚拟时间的调度程序的动作非常清晰,然后再推荐使用Reactor Core进行测试的方法。

import org.assertj.core.api.Assertions.assertThat
import org.junit.Test
import reactor.core.publisher.Flux
import reactor.test.scheduler.VirtualTimeScheduler
import java.time.Duration
import java.util.concurrent.CountDownLatchclass VirtualTimeTest {@Testfun testExplicit() {val mutableList = mutableListOf<Long>()val scheduler = VirtualTimeScheduler.getOrSet()val flux = Flux.interval(Duration.ofSeconds(10), Duration.ofSeconds(5), scheduler).take(3)val latch = CountDownLatch(1)flux.subscribe({ l -> mutableList.add(l) }, { _ -> }, { latch.countDown() })scheduler.advanceTimeBy(Duration.ofSeconds(10))assertThat(mutableList).containsExactly(0L)scheduler.advanceTimeBy(Duration.ofSeconds(5))assertThat(mutableList).containsExactly(0L, 1L)scheduler.advanceTimeBy(Duration.ofSeconds(5))assertThat(mutableList).containsExactly(0L, 1L, 2L)latch.await()}}

1.首先,将“ Flux.interval”功能的计划程序设置为基于虚拟时间的计划程序。

2.预计在10秒延迟后每5秒发射一次数据流

3. VirtualTimeScheduler提供了一种“ advanceTimeBy”方法来将虚拟时间提前一个持续时间,因此该时间将首先提前10秒的延迟时间,届时将发出第一个元素(0)。

4.然后将其前进5秒钟两次,分别得到1和2。

这是确定性的,测试可以快速完成。 但是,此版本的测试很丑陋,它使用列表来收集和声明结果,并使用CountDownLatch控制何时终止测试。 测试Reactor-Core类型的一种更为简洁的方法是使用出色的StepVerifier类,并且使用该类的测试如下所示:

import org.junit.Test
import reactor.core.publisher.Flux
import reactor.test.StepVerifier
import reactor.test.scheduler.VirtualTimeScheduler
import java.time.Durationclass VirtualTimeTest {@Testfun testWithStepVerifier() {VirtualTimeScheduler.getOrSet()val flux = Flux.interval(Duration.ofSeconds(10), Duration.ofSeconds(5)).take(3)StepVerifier.withVirtualTime({ flux }).expectSubscription().thenAwait(Duration.ofSeconds(10)).expectNext(0).thenAwait(Duration.ofSeconds(5)).expectNext(1).thenAwait(Duration.ofSeconds(5)).expectNext(2).verifyComplete()}}

借助StepVerifier进行的这项新测试可以很好地理解每步前进的时间,并断言当时的期望值。

翻译自: https://www.javacodegeeks.com/2017/09/testing-time-based-reactor-core-streams-virtual-time.html

使用虚拟时间测试基于时间的反应堆堆芯流相关推荐

  1. react核心虚拟dom_使用虚拟时间测试基于时间的React堆核心流

    react核心虚拟dom Reactor Core实现了Reactive Streams规范,并处理了(可能无限的)数据流. 如果您感兴趣,请查看它提供的出色文档 . 在这里,我假设对Reactor ...

  2. 网络信息安全之基于时间的安全模型(PDR和PPDR模型)

    基于时间的安全模型是基于"任何安全防护措施都是基于时间的,超过该时间段,这种防护措施是可能被攻破的"这样的前提.该模型主要给出了信息系统的攻防时间表.攻击时间指的是在系统采取某种防 ...

  3. 《基于Apache Flink的流处理》读书笔记

    第1章 状态化流处理概述 传统数据处理 绝大多数企业所实现的传统架构都会将数据处理分为两类: 事务型处理 分析型处理 事务型处理 企业在日常业务运营过程中会用到各类应用,例如:客户管理管理软件.基于W ...

  4. 渗透测试——sql注入进阶/基于时间的盲注/一看就会/

    目录 一.注入点判断 注入类型 SQL注入的类型 二.基于时间的时间盲注 什么是时间盲注 sleep()函数 常用函数 三.bWAPP基于时间的盲注实战 一.注入点判断 1.输入一个单引号',因为语句 ...

  5. 基于Arduino主板的简易反应时间测试小游戏

    基于Arduino主板的反应时间测试小游戏 //Arduino IDE //稍微解释一下volatile, 一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这 ...

  6. 基于网络的虚拟仪器测试系统

    引 言 著名科学家门捷列夫说:"没有测量,就没有科学".测量科学的先驱凯尔文又说,一个事物你如果能够测量它,并且能用数字来表达它,你对它就有了深刻的了解:但如果你不知道如何测量它, ...

  7. 微信基于时间序的海量存储扩展性与多机容灾能力提升

    作者:jeryyzhang,腾讯 WXG 后台开发工程师 背景介绍 业务场景 作为以手机为主要平台的移动社交应用,微信内大部分业务生成的数据是有共性可言的:数据键值带有时间戳信息,并且单用户数据随着时 ...

  8. 熔断器熔断时间标准_一种熔断器熔断时间测试电路的制作方法

    本实用新型涉及汽车制造技术领域,尤其涉及一种熔断器熔断时间测试电路. 背景技术: 伴随着日新月异的科技进步,人们对生活质量的追求也越来越高,汽车已经成为人们日常出行必不可少的交通工具,人们对汽车的舒适 ...

  9. Oracle基于时间点的恢复(转载)

    Oracle基于时间点的恢复 2010-10-19 18:43 Oracle基于时间点的恢复能够精确到什么样的精度? 这是一个需要关心的问题. 以下测试用于进行一点说明. 1.首先做好冷备份 2.创建 ...

最新文章

  1. 在一个html加载多个echarts,Echarts一个页面加载多个图表及图表自适应
  2. Android项目启动时短暂的黑屏白屏处理
  3. 网卡驱动和队列层中的数据包接收
  4. java关于hashmap编程题_LeetCode算法题-Design HashMap(Java实现)
  5. 【工具大道】UML的点点滴滴
  6. 自动驾驶面试题汇总(2022秋招题库)——持续更新
  7. Element-UI-简单组合效果---Element-UI工作笔记002
  8. mysql 无法链接, 输入密码失败
  9. 刚进职场的新人,这6点一定要牢记
  10. 需求分析模板_看完总经理做的公司财务经营分析报告,怪不得人家能拿年薪150万...
  11. Cmder的下载安装及使用
  12. java线程栈日志_Java线程堆栈
  13. 对文本简单加密解密算法
  14. pr如何跳到关键帧_(小白学PR不迷路)只要你用过PR,这些问题你一定遇到过
  15. A1013 Battle Over Cities [图的dfs遍历]
  16. 用python写一个股票提醒、并用邮件方式发送出去
  17. SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame
  18. 集效率之大成的EfficientNet
  19. ORACLE应用产品和SAP、SSA、SYMIX产品的比较分析
  20. multi-angle cosine and sines

热门文章

  1. 三年半Java后端面试经历
  2. Java多线程之守护线程实战
  3. JDK8新特性之方法引用
  4. “老师,我写着写着就 强制交卷了……”
  5. html图片通过照片查看器打开图片,在Windows7中打开照片,提示“Windows 照片查看器无法显示此图片,因为计算机上...
  6. tcp协议中的长连接和短连接服务器,谈谈HTTP协议中的短轮询、长轮询、长连接和短链接...
  7. java生产者实现kafka拦截器
  8. Java 流式编程stream
  9. 单列集合Set的实现类HashSet
  10. 自动化测试框架 2019_2019年用于自动化的5个最佳Java测试框架