日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

3.3 测试实现标准的ZIO服务

發布時間:2024/3/13 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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服务的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 午夜免费看片 | 五月婷婷丁香激情 | 日韩第一页在线 | 亚洲视频456| 亚洲国产精品美女 | 国产成人无码专区 | 动漫美女隐私无遮挡 | 四虎影视8848hh | 欧美黑人又粗又大的性格特点 | 中文字幕免费在线观看视频 | 曰本无码人妻丰满熟妇啪啪 | 浪漫樱花在线观看高清动漫 | 欧美三级一区二区三区 | 91精品国产一区 | 奇米婷婷| 欧美三级久久 | 久久福利影院 | 天天爽| 精品亚洲一区二区三区 | 日批在线视频 | www污污| 国产一级二级三级精品 | 日韩一区二区三区免费在线观看 | 色婷五月 | 国产这里只有精品 | 青青草华人在线 | 激情黄色小说视频 | 国产精品福利小视频 | 日皮毛片 | 欧美综合图片 | 一个人在线观看www软件 | 国产男女激情 | 理论片91| 四虎国产成人永久精品免费 | 国产学生美女无遮拦高潮视频 | 激情总合网| 熟妇熟女乱妇乱女网站 | 国产成人av一区二区三区在线观看 | 30一40一50女人毛片 | 欧美黄页| caoporn成人 | 九九热这里都是精品 | 天天射夜夜操 | 欧美裸体xxxx极品少妇 | 日日夜夜婷婷 | 国产精品入口麻豆 | 牛牛视频在线观看 | 欧美一级一级 | 色视频一区 | 日韩av不卡在线 | 亚洲a视频 | 成人亚洲一区二区 | 在线观看中文字幕码 | 白丝av| 日韩精品视频免费在线观看 | 亚洲欧美日韩色图 | 99久热在线精品996热是什么 | 男女视频免费网站 | 久久露脸国语精品国产91 | 亚洲欧美网址 | 日日碰狠狠躁久久躁蜜桃 | 亚洲婷婷综合网 | 亚洲欧美日韩精品久久亚洲区 | 一级片在线播放 | 国产大尺度视频 | 欧美黄视频在线观看 | 日韩欧美国产亚洲 | 中文av字幕 | 欧美福利电影 | 新久草视频 | 欧美成一区二区三区 | 亚洲欧美日本一区二区 | 日韩久久久久久久久久久 | 69日本xxxxxxxx96 | 天堂av一区二区三区 | 国久久 | 高清日韩一区二区 | 成人性生交视频免费观看 | 制服师生在线 | 涩涩视频在线观看 | 中文字幕av一区二区三区人妻少妇 | 国产在线看一区 | 免费黄色一级片 | 国产精品扒开腿做爽爽爽a片唱戏 | 日韩在线观看免费高清 | 精品一区二区在线视频 | 久久精品视频在线观看 | www.黄色免费 | 综合网久久 | 伊人久久久久久久久久久久久 | 亚洲一区你懂的 | 国产色婷婷一区二区三区竹菊影视 | 成人免费看片网站 | 99精品乱码国产在线观看 | 蜜臀av免费一区二区三区水牛 | 亚洲欧美综合另类自拍 | 亚洲一区免费电影 | 精品国产免费无码久久久 | 调教91|