单元测试异步scala代码



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

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

场景# 1

<>之前def foo: Unit = {未来{做某事}未来{doSomethingElse}}private defdosomething: Unit = serviceCall1private def doSomethingElse: Unit = serviceCall2之前

情景动机

foo立即返回,但调用2个执行单独任务的期货(例如保存分析和存储记录到DB)。这些服务调用可以被模拟,但我要测试的是,一旦我将这两个服务包装在Future s

中,它们就会被调用。

场景# 2

<>之前def bar: Unit = {val futureX = doAsyncXval futureY = doAsyncY为{x <- futureX-未来} yield {等待(x, y)}}之前

情景动机

从可以并发执行的长时间运行计算开始(例如获得总访问者数量并获得我们网站经常使用的User-Agent头)。将结果合并到其他操作中(在本例中,Unit方法只是抛出值)

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

EDIT我现在在做什么

<>之前隐含值context = ExecutionContext.fromExecutor(testExecutor)def testExecutor = {new Executor {def execute(runnable: runnable) = runnable.run}}之前

这个ExecutionContext实现不会将Future作为一个单独的线程运行,整个执行将按顺序完成。这感觉有点像一个hack,但基于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

ScalaTestX支持异步非阻塞测试

最新更新