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