3 3 測試實現標準的ZIO服務

2021-10-18 20:22:55 字數 2184 閱讀 3048

我們測試zio程式時,我們遇到的常見問題之一就是使用zio的標準服務來測試effect。

例如,考慮這個簡單的控制台程式。

import zio.console._

val greet: zio[console,

nothing

,unit]=

foryield()

// 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 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@7be0b150

object examplespec extends defaultrunnablespec yield assertcompletes }

) }

我們在這裡用fork和join操作介紹了幾個新概念,我們將在後面幾章中更全面地了解這些概念,但是在這裡fork是將goshopping作為單獨的邏輯過程開始執行,而主程式流程繼續進行。而

join 會等待該過程完成。

由於使用的clock實現是testclock,因此只有在使用者通過呼叫諸如adjust之類的運算子進行調整時,時間才會過去。

在這裡adjust(1.hour)使所有計畫在一小時或更短時間內執行的效果立即按順序執行,從而導致goshopping完成執行並允許程式終止。

我們在這裡使用assertcompletes(這是乙個始終滿足的斷言)來更清楚地表達我們的意圖,即我們在此處測試的只是該程式已完全完成。

服務匯流排yali測試 汽車測試標準之匯流排負載率測試

汽車測試標準之匯流排負載率測試 一直以來,汽車的測試都離不開 can,而 can的應用也離不開汽車行 業。因此,在新能源汽車越發成熟的今天,can的一致性測試也成為各整車 廠和零部件廠商關注的焦點。這裡對 can一致性測試中的負載率測試做一 些簡單的介紹。負載率測試是 can協議一致性測試裡的必測專...

軟體測試的基本測試標準過程

1,計畫 識別測試的任務 定義測試的目標 為實現測試目標和任務定義規格說明 2,控制 通過對測試進展和測試計畫之間的比較,報告測試的狀態,包括與計畫之間存在的偏差 包括在必要的時候採取必要的措施來滿足測試的任務和目標 3,分析和設計 分析測試目標和形成測試設計 將測試條件轉化為測試用例,測軟體 測試...

效能測試的標準測試場景

1 單交易基準測試時指通過單個虛擬使用者逐筆發起交易,該測試用於獲取交易的效能基線。2 單交易負載測試是指通過一定的併發使用者,對某個被測試交易施加較大的壓力,通過單交易負載測試能夠暴露被測試交易自身的效能問題,並進行調優。3 混合負載測試是按照特定的比例,併發發起多個被測交易,混合負載測試是最接近...