3.3 测试实现标准的ZIO服务
3.3 測試實(shí)現(xiàn)標(biāo)準(zhǔn)的ZIO服務(wù)
我們測試ZIO程序時,我們遇到的常見問題之一就是使用ZIO的標(biāo)準(zhǔn)服務(wù)來測試effect。
例如,考慮這個簡單的控制臺程序。
這是一個非常簡單的程序,我們相信它是正確的,但是我們將如何對其進(jìn)行測試?
我們可以自己運(yùn)行程序并驗證是否收到了預(yù)期的控制臺輸出,但這是非常手動的,并且可能導(dǎo)致對潛在的控制臺輸入的測試覆蓋面非常小,并且隨著代碼庫其他部分的更改而缺乏持續(xù)集成。
所以我們不想這樣做。 但是我們還要如何測試呢?
getStrLn將要從控制臺讀取實(shí)際的行,而putStrLn將要向控制臺打印實(shí)際的行,那么我們?nèi)绾翁峁┹斎氩Ⅱ炞C輸出正確而不實(shí)際自己做呢?
這就是控制臺是環(huán)境中的一項服務(wù)的事實(shí)。 因為Console是一項服務(wù),所以我們可以提供另一種測試實(shí)現(xiàn),例如,它從已填充了適當(dāng)輸入的輸入緩沖區(qū)“讀取”行,并將行“寫入”到我們可以檢查的輸出緩沖區(qū)。
ZIO Test就是這樣做的,它提供了所有標(biāo)準(zhǔn)ZIO服務(wù)的TestConsole,TestClock,TestRandom和TestSystem實(shí)現(xiàn),這些服務(wù)完全確定性地有助于測試。
ZIO Test將自動為我們的每個測試提供這些服務(wù)的副本,這使此操作極為容易。 通常,我們需要做的就是調(diào)用幾個特定的“測試”方法來提供所需的輸入并驗證輸出。
為此,讓我們看一下如何測試上面的控制臺程序。
我們現(xiàn)在已經(jīng)從根本無法測試的程序變成了完全可以測試的程序。現(xiàn)在,我們甚至可以使用ZIO
Test對下面所述的基于屬性的測試的支持來提供各種不同的輸入,并將其包括在我們的持續(xù)集成過程中,以在此處獲得很高的測試覆蓋率。
請注意,每個服務(wù)都會自動為每個測試提供單獨(dú)的副本,因此您在使用這些測試服務(wù)時不必?fù)?dān)心測試之間的干擾。
對于測試并發(fā)程序特別有用的另一個測試服務(wù)是TestClock。正如在上一章中所看到的,我們通常希望將事件安排在某個指定的持續(xù)時間之后發(fā)生,例如,在一個小時內(nèi)進(jìn)行g(shù)oShopping,并且我們想驗證事件是否確實(shí)在指定的持續(xù)時間之后發(fā)生。
同樣,我們面臨測試的問題。我們是否需要等待一個小時,以便goShopping執(zhí)行以驗證其是否已正確調(diào)度?
No! TestClock允許我們確定性地測試涉及時間的效果,而無需等待實(shí)時時間過去。
這是我們可以使用TestClock測試延遲指定時間的方法的方法。
我們在這里用fork和join操作介紹了幾個新概念,我們將在后面幾章中更全面地了解這些概念,但是在這里fork是將goShopping作為單獨(dú)的邏輯過程開始執(zhí)行,而主程序流程繼續(xù)進(jìn)行。而
join 會等待該過程完成。
由于使用的Clock實(shí)現(xiàn)是TestClock,因此只有在用戶通過調(diào)用諸如Adjust之類的運(yùn)算符進(jìn)行調(diào)整時,時間才會過去。
在這里Adjust(1.hour)使所有計劃在一小時或更短時間內(nèi)運(yùn)行的效果立即按順序運(yùn)行,從而導(dǎo)致goShopping完成執(zhí)行并允許程序終止。
我們在這里使用assertCompletes(這是一個始終滿足的斷言)來更清楚地表達(dá)我們的意圖,即我們在此處測試的只是該程序已完全完成。
總結(jié)
以上是生活随笔為你收集整理的3.3 测试实现标准的ZIO服务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CentOS (linux) 启动错误
- 下一篇: 谈谈WebService开发-基础篇