[英]Unit test async scala code
嘗試並發執行我想知道如何實際測試它。 執行流程具有副作用,並且創建期貨以包裝獨立的執行/處理。
一直在尋找一些關於如何正確單元測試以下場景的好例子( foo
和bar
是我想測試的方法):
場景#1
def foo : Unit = { Future { doSomething } Future { doSomethingElse } } private def doSomething : Unit = serviceCall1 private def doSomethingElse : Unit = serviceCall2
情景動機
foo
立即返回,但調用2個期貨執行單獨的任務(例如,將分析和存儲記錄保存到DB)。 這些服務調用可以被模擬,但我正在嘗試測試的是,一旦我將它們包裝在Future
s中,這兩個服務都會被調用
場景#2
def bar : Unit = { val futureX = doAsyncX val futureY = doAsyncY for { x <- futureX y <- futureY } yield { noOp(x, y) } }
情景動機
從可以同時執行的長時間運行計算開始(例如,獲取總訪問者數量並將常用的User-Agent
標頭添加到我們的網站)。 將結果合並到其他一些操作中(在這種情況下, Unit
方法只是拋出值)
注意我熟悉演員和測試演員,但考慮到上面的代碼,我想知道什么應該是最合適的方法(包括重構)
編輯 我現在在做什么
implicit value context = ExecutionContext.fromExecutor(testExecutor) def testExecutor = { new Executor { def execute(runnable : Runnable) = runnable.run } }
此ExecutionContext
實現不會將Future
作為單獨的線程運行,整個執行將按順序完成。 這種感覺就像一個黑客,但根據Electric Monk的回答,似乎其他解決方案更像是一樣。
一種解決方案是使用DeterministicExecutor 。 不是一個scalaesque解決方案,但應該這樣的伎倆。
如果您使用的是ScalaTest,請查看: http : //doc.scalatest.org/2.0/index.html#org.scalatest.concurrent.Futures
Specs2還支持測試期貨: http ://etorreborre.github.io/specs2/guide/org.specs2.guide.Matchers.html
ScalaTest 3.x支持異步非阻塞測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.