【问题标题】:Unit test async scala code单元测试异步 Scala 代码
【发布时间】:2014-09-29 21:24:50
【问题描述】:

尝试并发执行我想知道如何实际测试它。 执行流程具有副作用性质,并创建期货来包装独立的执行/处理。

一直在寻找一些关于如何正确单元测试以下场景的好例子(foo 和 bar 是我希望测试的方法):

场景 #1

def foo : 单位 = { 未来{做某事} 未来 { doSomethingElse } } 私人 def doSomething : 单位 = serviceCall1 私人定义 doSomethingElse :单位 = serviceCall2

情景动机

foo 立即返回,但调用 2 个执行单独任务的期货(例如,保存分析并将记录存储到数据库)。这些服务调用可以被模拟,但我要测试的是,一旦我将它们包装在Futures 中,这两个服务都会被调用

场景 #2

def bar : 单位 = { val futureX = doAsyncX val futureY = doAsyncY 为了 { x

情景动机

从可以同时执行的长时间运行的计算开始(例如,获取总访问者的数量并获取我们网站上经常使用的User-Agent 标头)。将结果合并到其他操作中(在这种情况下,Unit 方法只是简单地抛出值)

注意我对演员和测试演员很熟悉,但是鉴于上面的代码,我想知道什么应该是最合适的方法(包括重构)

编辑 我现在在做什么

隐式值上下文 = ExecutionContext.fromExecutor(testExecutor) def testExecutor = { 新执行者{ def execute(runnable : Runnable) = runnable.run } }

此ExecutionContext 实现不会将Future 作为单独的线程运行,整个执行将按顺序完成。这有点像 hack,但基于 Electric Monk 的回答,似乎其他解决方案更相似。

【问题讨论】:

  • 我删除了我的答案,因为它不是主题,但你真的应该更清楚地解释你的问题。
  • @GabrielePetronella 感谢您的回答和评论。我已经编辑了我的答案,以(希望)更好地反映我的意图。
  • 唯一需要测试的是 foo 调用了 2 个方法 doSomething 和 doSomethingElse 吗?您正在寻找证明他们被召唤并且不在乎他们做什么的证据?
  • @Nimrod007 正确。场景 #1 测试两个服务都被调用。场景 #2 更复杂,但 noOp 可以是一个模拟服务,我希望测试它是否按预期调用
  • 除了切换到实际返回 Futures(可能是更好的选择)之外,我看到的唯一选择是使用顺序执行器(就像你所做的那样),或者破解你的模拟服务标记一个条件你可以在测试代码中等待。

标签: scala unit-testing asynchronous future


【解决方案1】:

【讨论】:

  • 我不是在测试Futures,而是在测试异步(并发)执行。请注意,这两种方法都是Unit,并且不返回Future
  • 但是,Future { doSomething } 确实返回了 Future。这就是文卡特回应的重点。
  • @BobDalgleish 但该方法不返回任何内容(它可以返回 Future[Unit] )
  • 好的,我现在开始了解了。在场景 1 中,您不会对 foo 进行单元测试,因为它本质上是一个 shim 或占位符。你有doSomething 和doSomethingElse 的单元测试吗?如果是这样,你可以使用scalatestFutures来测试Future { doSomething }等
  • @Bivas 您有解决问题的方法吗?我想在返回 Unit 的异步方法上编写集成测试。
【解决方案2】:

一种解决方案是使用DeterministicExecutor。不是一个大规模的解决方案,但技巧应该如此。

【讨论】:

  • 我已经添加了我目前正在测试的解决方案。这看起来与DeterministicExecutor 的方法相同。难道没有更简洁的方法来测试异步执行吗?
  • 这与调用ExecutorService.shutdown 后跟ExecutorService.awaitTermination 有何不同?
【解决方案3】:

ScalaTest 3.x 支持异步非阻塞测试。

【讨论】:

    猜你喜欢
    • 2016-02-23
    • 2020-04-15
    • 2019-11-12
    • 1970-01-01
    • 2012-07-15
    • 2012-11-25
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    相关资源
    最近更新 更多