3.3 测试实现标准的ZIO服务
3.3 测试实现标准的ZIO服务
我们测试ZIO程序时,我们遇到的常见问题之一就是使用ZIO的标准服务来测试effect。
例如,考虑这个简单的控制台程序。
import zio.console._val greet: ZIO[Console, Nothing, Unit] = for {name <- getStrLn.orDie_ <- putStrLn(s"Hello, $name!")} yield ()// greet: ZIO[Console, Nothing, Unit] = zio.ZIO$FlatMap@61f0affd
这是一个非常简单的程序,我们相信它是正确的,但是我们将如何对其进行测试?
我们可以自己运行程序并验证是否收到了预期的控制台输出,但这是非常手动的,并且可能导致对潜在的控制台输入的测试覆盖面非常小,并且随着代码库其他部分的更改而缺乏持续集成。
所以我们不想这样做。 但是我们还要如何测试呢?
getStrLn将要从控制台读取实际的行,而putStrLn将要向控制台打印实际的行,那么我们如何提供输入并验证输出正确而不实际自己做呢?
这就是控制台是环境中的一项服务的事实。 因为Console是一项服务,所以我们可以提供另一种测试实现,例如,它从已填充了适当输入的输入缓冲区“读取”行,并将行“写入”到我们可以检查的输出缓冲区。
ZIO Test就是这样做的,它提供了所有标准ZIO服务的TestConsole,TestClock,TestRandom和TestSystem实现,这些服务完全确定性地有助于测试。
ZIO Test将自动为我们的每个测试提供这些服务的副本,这使此操作极为容易。 通常,我们需要做的就是调用几个特定的“测试”方法来提供所需的输入并验证输出。
为此,让我们看一下如何测试上面的控制台程序。
import zio.test.environment._object ExampleSpec extends DefaultRunnableSpec {def spec = suite("ExampleSpec")(testM("greet says hello to the user") {for {_ <- TestConsole.feedLines("Jane")_ <- greetvalue <- TestConsole.output} yield assert(value)(equalTo(Vector("Hello, Jane!\n")))})}
我们现在已经从根本无法测试的程序变成了完全可以测试的程序。现在,我们甚至可以使用ZIO
Test对下面所述的基于属性的测试的支持来提供各种不同的输入,并将其包括在我们的持续集成过程中,以在此处获得很高的测试覆盖率。
请注意,每个服务都会自动为每个测试提供单独的副本,因此您在使用这些测试服务时不必担心测试之间的干扰。
对于测试并发程序特别有用的另一个测试服务是TestClock。正如在上一章中所看到的,我们通常希望将事件安排在某个指定的持续时间之后发生,例如,在一个小时内进行goShopping,并且我们想验证事件是否确实在指定的持续时间之后发生。
同样,我们面临测试的问题。我们是否需要等待一个小时,以便goShopping执行以验证其是否已正确调度?
No! TestClock允许我们确定性地测试涉及时间的效果,而无需等待实时时间过去。
这是我们可以使用TestClock测试延迟指定时间的方法的方法。
import zio.clock._ import zio.duration._val goShopping: ZIO[Console with Clock, Nothing, Unit] = putStrLn("Going shopping!").delay(1.hour)// goShopping: ZIO[Console with Clock, Nothing, Unit] = zio.ZIO$FlatMap@7be0b150object ExampleSpec extends DefaultRunnableSpec {def spec = suite("ExampleSpec")( testM("goShopping delays for one hour") {for {fiber <- goShopping.fork_ <- TestClock.adjust(1.hour)_ <- fiber.join} yield assertCompletes }) }
我们在这里用fork和join操作介绍了几个新概念,我们将在后面几章中更全面地了解这些概念,但是在这里fork是将goShopping作为单独的逻辑过程开始执行,而主程序流程继续进行。而
join 会等待该过程完成。
由于使用的Clock实现是TestClock,因此只有在用户通过调用诸如Adjust
之类的运算符进行调整时,时间才会过去。
在这里Adjust(1.hour)
使所有计划在一小时或更短时间内运行的效果立即按顺序运行,从而导致goShopping完成执行并允许程序终止。
我们在这里使用assertCompletes(这是一个始终满足的断言)来更清楚地表达我们的意图,即我们在此处测试的只是该程序已完全完成。
3.3 测试实现标准的ZIO服务相关推荐
- 2.8 zio入门——标准ZIO服务
2.8 标准ZIO服务 在本章的前面,我们讨论了ZIO环境类型,但是我们还没有使用它来编写任何程序. 在本书的后面,我们将深入介绍环境,并说明该环境如何为依赖项注入问题提供全面的解决方案. 现在,我们 ...
- c语言输入身高计算标准体重_体侧标准||身高、体重测试评分标准
体测标准 | 身高 / 体重测试评分标准 身高 / 体重测试评分标准 身高项目介绍 身高是反映学生生长发育水平的常用指标,与体重配合使用,可以有效地评价学生身体的匀称度与营养状况.该指标的测试适用于小 ...
- 软件测试 测试停止标准_停止正常测试
软件测试 测试停止标准 I see a lot of data scientists using tests such as the Shapiro-Wilk test and the Kolmogo ...
- 如何创建一个标准的Windows服务
如何创建一个标准的Windows服务 Posted on 2009-02-11 13:08 伍华聪 阅读(4693) 评论(16) 编辑 收藏 在很多时候,我们需要一个定时器,当间隔某段时间或者在某一 ...
- 计算机标签高低温标准,液晶显示屏高温高湿测试判断标准
液晶显示屏(LCD)用于数字型钟表和许多便携式计算机的一种显示器类型.LCD显示使用了两片极化材料,在它们之间是液体水晶溶液.电流通过该液体时会使水晶重新排列,以使光线无法透过它们.因此,每个水晶就像 ...
- 测试普通话水平的软件,求测试普通话标准的软件?6款普通话软件推荐
现在生活中,很多朋友都会用普通话交流,当然一口流利标准的普通话,也可以让你在朋友面前印象深刻哦.当然,对于讲普通话不标准的朋友来说,可以用普通话软件来纠正发音,告别塑料普通话哦.那么,有网友就在网上求 ...
- 普通话水平测试软件怎么样,求测试普通话标准的软件?6款普通话软件推荐
现在生活中,很多朋友都会用普通话交流,当然一口流利标准的普通话,也可以让你在朋友面前印象深刻哦.当然,对于讲普通话不标准的朋友来说,可以用普通话软件来纠正发音,告别塑料普通话哦.那么,有网友就在网上求 ...
- 工业机器人测试认证标准
简述. 之前整理过一次工业机器人的相关标准,包含测试认证的,技术指导的,行业要求的.并添加了在线链接,主要是道客巴巴(复制的时候,不能复制链接,分享下在线文档),方便需要时及时阅读.这里也分享需要的人 ...
- 基于OGC标准的地图服务
基于OGC标准的地图服务 前言 目前在一家公司做前端开发,公司主要产品是可视化大屏,对前端开发而言,可视化大屏开发中地图是一个重点难点,在公司的项目中经常会用到amap.mapbox.openlaye ...
最新文章
- 正确“假期休息模式”
- 万字干货 | Python后台开发的高并发场景优化解决方案
- SCI至上只是结果,而不是原因
- 3月19 HTML静态网页的制作
- std::future ---C++17 多线程
- SQL 取n到m条记录
- Python练习:七段数码管绘制
- Linux虚拟化KVM-Qemu分析(二)之ARMv8虚拟化
- JavaScript中的(内置)方式来检查字符串是否为有效数字
- python和java哪个好-Python和Java到底哪个更好?
- 基于java的随机森林算法_基于Spark实现随机森林代码
- pandownload获取bdstoken失败怎么回事_巴菲特点透中国股市:假如你手中持有的股票早上快速拉高然后慢慢下跌,你晓得是怎么回事吗?...
- 阶段3 3.SpringMVC·_06.异常处理及拦截器_3 SpringMVC异常处理之异常处理代码编写
- python 菜鸟联盟-菜鸟联盟python
- 在小米R1D 中,为 Advanced Tomato 添加菜单
- 对ID3算法的理解及其优缺点
- Masked Arrays(numpy arrays掩码)针对数据中存在无效或者确实数据
- navigator for mysql_SQL Navigator 7
- android 两边圆角,Android自定义View实现带4圆角或者2圆角的效果
- 项目管理软件有哪些,哪个好用?
热门文章
- 微波链路视距(Line of Sight,LOS)传播勘测
- 成都拓嘉启远:拼多多直通车推广怎么做才能有开好
- 拓嘉辰丰:影响拼多多直通车推广效果的因素有哪些?
- 蓝牙鼠标链接Win10需要“输入MI MOUSE BT3.0的PIN”的解决方案
- 中央电大 c语言程序设计a 试题,中央电大208年秋C语言程序设计A试题1.doc
- 计算机安全领域四大顶级会议,安全领域四大会议
- visual studio2017登录时需要更新 microsoft edge 或当前浏览器的最新版本
- window10系统安装梅雁EDMS(MAYAN EDMS)
- bootstrap class path not set in conjunction with -source 1.6
- REUSE_ALV_GRID_DISPLAY_LVC-可编辑单元格