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服务相关推荐

  1. 2.8 zio入门——标准ZIO服务

    2.8 标准ZIO服务 在本章的前面,我们讨论了ZIO环境类型,但是我们还没有使用它来编写任何程序. 在本书的后面,我们将深入介绍环境,并说明该环境如何为依赖项注入问题提供全面的解决方案. 现在,我们 ...

  2. c语言输入身高计算标准体重_体侧标准||身高、体重测试评分标准

    体测标准 | 身高 / 体重测试评分标准 身高 / 体重测试评分标准 身高项目介绍 身高是反映学生生长发育水平的常用指标,与体重配合使用,可以有效地评价学生身体的匀称度与营养状况.该指标的测试适用于小 ...

  3. 软件测试 测试停止标准_停止正常测试

    软件测试 测试停止标准 I see a lot of data scientists using tests such as the Shapiro-Wilk test and the Kolmogo ...

  4. 如何创建一个标准的Windows服务

    如何创建一个标准的Windows服务 Posted on 2009-02-11 13:08 伍华聪 阅读(4693) 评论(16) 编辑 收藏 在很多时候,我们需要一个定时器,当间隔某段时间或者在某一 ...

  5. 计算机标签高低温标准,液晶显示屏高温高湿测试判断标准

    液晶显示屏(LCD)用于数字型钟表和许多便携式计算机的一种显示器类型.LCD显示使用了两片极化材料,在它们之间是液体水晶溶液.电流通过该液体时会使水晶重新排列,以使光线无法透过它们.因此,每个水晶就像 ...

  6. 测试普通话水平的软件,求测试普通话标准的软件?6款普通话软件推荐

    现在生活中,很多朋友都会用普通话交流,当然一口流利标准的普通话,也可以让你在朋友面前印象深刻哦.当然,对于讲普通话不标准的朋友来说,可以用普通话软件来纠正发音,告别塑料普通话哦.那么,有网友就在网上求 ...

  7. 普通话水平测试软件怎么样,求测试普通话标准的软件?6款普通话软件推荐

    现在生活中,很多朋友都会用普通话交流,当然一口流利标准的普通话,也可以让你在朋友面前印象深刻哦.当然,对于讲普通话不标准的朋友来说,可以用普通话软件来纠正发音,告别塑料普通话哦.那么,有网友就在网上求 ...

  8. 工业机器人测试认证标准

    简述. 之前整理过一次工业机器人的相关标准,包含测试认证的,技术指导的,行业要求的.并添加了在线链接,主要是道客巴巴(复制的时候,不能复制链接,分享下在线文档),方便需要时及时阅读.这里也分享需要的人 ...

  9. 基于OGC标准的地图服务

    基于OGC标准的地图服务 前言 目前在一家公司做前端开发,公司主要产品是可视化大屏,对前端开发而言,可视化大屏开发中地图是一个重点难点,在公司的项目中经常会用到amap.mapbox.openlaye ...

最新文章

  1. 正确“假期休息模式”
  2. 万字干货 | Python后台开发的高并发场景优化解决方案
  3. SCI至上只是结果,而不是原因
  4. 3月19 HTML静态网页的制作
  5. std::future ---C++17 多线程
  6. SQL 取n到m条记录
  7. Python练习:七段数码管绘制
  8. Linux虚拟化KVM-Qemu分析(二)之ARMv8虚拟化
  9. JavaScript中的(内置)方式来检查字符串是否为有效数字
  10. python和java哪个好-Python和Java到底哪个更好?
  11. 基于java的随机森林算法_基于Spark实现随机森林代码
  12. pandownload获取bdstoken失败怎么回事_巴菲特点透中国股市:假如你手中持有的股票早上快速拉高然后慢慢下跌,你晓得是怎么回事吗?...
  13. 阶段3 3.SpringMVC·_06.异常处理及拦截器_3 SpringMVC异常处理之异常处理代码编写
  14. python 菜鸟联盟-菜鸟联盟python
  15. 在小米R1D 中,为 Advanced Tomato 添加菜单
  16. 对ID3算法的理解及其优缺点
  17. Masked Arrays(numpy arrays掩码)针对数据中存在无效或者确实数据
  18. navigator for mysql_SQL Navigator 7
  19. android 两边圆角,Android自定义View实现带4圆角或者2圆角的效果
  20. 项目管理软件有哪些,哪个好用?

热门文章

  1. 微波链路视距(Line of Sight,LOS)传播勘测
  2. 成都拓嘉启远:拼多多直通车推广怎么做才能有开好
  3. 拓嘉辰丰:影响拼多多直通车推广效果的因素有哪些?
  4. 蓝牙鼠标链接Win10需要“输入MI MOUSE BT3.0的PIN”的解决方案
  5. 中央电大 c语言程序设计a 试题,中央电大208年秋C语言程序设计A试题1.doc
  6. 计算机安全领域四大顶级会议,安全领域四大会议
  7. visual studio2017登录时需要更新 microsoft edge 或当前浏览器的最新版本
  8. window10系统安装梅雁EDMS(MAYAN EDMS)
  9. bootstrap class path not set in conjunction with -source 1.6
  10. REUSE_ALV_GRID_DISPLAY_LVC-可编辑单元格