簡體   English   中英

單元測試異步scala代碼

[英]Unit test async scala code

嘗試並發執行我想知道如何實際測試它。 執行流程具有副作用,並且創建期貨以包裝獨立的執行/處理。

一直在尋找一些關於如何正確單元測試以下場景的好例子( foobar是我想測試的方法):

場景#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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM