当前位置: 首页 > 知识库问答 >
问题:

单元测试异步scala代码

董新觉
2023-03-14

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

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

情景#1

def foo : Unit = {
    Future { doSomething }
    Future { doSomethingElse }
}

private def doSomething : Unit = serviceCall1
private def doSomethingElse : Unit = serviceCall2

情景动机

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

场景#2

def bar : Unit = {
    val futureX = doAsyncX
    val futureY = doAsyncY
    for {
        x <- futureX
        y <- futureY
    } yield {
        noOp(x, y)
    }
}

情景动机

从可以同时执行的长时间运行的计算开始(例如,获取总访客数,并获取网站上经常使用的用户代理标题)。将结果合并到其他一些操作中(在本例中,它是只抛出值的Unit方法)

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

编辑我现在正在做的事情

implicit value context = ExecutionContext.fromExecutor(testExecutor)

def testExecutor = {
    new Executor {
        def execute(runnable : Runnable) = runnable.run
    }
}

这个执行上下文实现不会将Future作为一个单独的线程运行,整个执行将按顺序完成。这有点像黑客攻击,但基于电子和尚的回答,似乎其他解决方案更相似。

共有3个答案

能远
2023-03-14

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

水浩歌
2023-03-14

如果您使用的是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

谭京
2023-03-14

一种解决方案是使用确定性执行器。这不是一个简单的解决方案,但应该是一个技巧。

 类似资料:
  • 我有一些代码,它使用的是class的方法,它是异步的。另外,我正在使用微软的单元测试应用程序项目来测试应用程序。 问题是测试框架并没有等待异步代码的运行结束,所以我无法检查它的结果。 如何使用Unit Test App项目测试异步代码?我没有使用异步/等待修改器。

  • 我在单元测试(用C#编写)中存根了必要的方法等,但问题是在断言测试之前异步操作没有完成。 我怎么才能绕过这个?我应该创建一个模拟TaskFactory或任何其他技巧来单元测试异步操作吗?

  • 问题内容: node.js模块列表中列出了30多个测试框架… 哪些框架最受欢迎?他们的优缺点是什么? 我正在寻找一个支持具有大量异步回调的代码的单元测试的框架(可能与大多数其他节点项目一样)。另外,我正在寻找简单而不是复杂的东西。 到目前为止,我已经研究了: Nodeunit很简单,通过让您定义希望调用多少个断言以及何时进行测试来支持异步代码。 Vowsjs看起来很有趣。使您可以很好地构建测试并具

  • 对于复杂的批处理任务,测试用例在点对点的测试方法中可能变成难于管理的。这些情况下,凭你们自己的力量用测试用例测试各个步骤更加有用。AbstractJobTests类包含一个方法launchStep需要一个步骤名称和运行特定的步骤。这个方法允许更有针对性的测试通过这个步骤允许测试设置数据并验证其结果。 JobExecution jobExecution = jobLauncherTestUtils.

  • 问题内容: 我是Java和junit的新手。我有以下要测试的代码。如果您能提出有关测试它的最佳方法的想法,将不胜感激。 基本上,以下代码与从集群中选出领导者有关。领导者在共享缓存上持有锁,并且如果领导者以某种方式释放了对缓存的锁定,则领导者的服务将恢复并处置。 我如何确保领导者/线程仍保持对缓存的锁定,并且在执行第一个线程时另一个线程无法恢复其服务? 问题答案: 作为测试框架的替代方法(或使用JU

  • 我不熟悉Scala中的单元测试,我找不到一种方法来存根单例对象中定义的函数。 例如: 我试图对Profile类中定义的函数进行单元测试。因为我不想在单元测试中通过web实际访问外部API,所以我尝试存根对象及其函数以返回一些预定义的值。 我研究了ScalaMock、EasyMock和Mockito框架,但找不到一种方法来存根单例对象的方法。ScalaMock状态 为什么所有的模拟框架都不提供这种功