问题标签 [akka-testkit]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
6042 浏览

scala - 如何模拟 Akka Actor 来对课程进行单元测试?

我有一个控制器类,它控制发送到注入控制器的 Akka 演员的请求。

控制器代码:

我的演员的代码是:

现在我需要模拟 ActorA 的行为来对 Controller 进行单元测试。有没有办法通过 Akka TestKit 做到这一点?

0 投票
2 回答
1469 浏览

scala - 如何使用 expectMsgClass 测试 Akka Action

我是 scala akka 的新手

在我的测试代码中我有这个

但我测试失败了。

所以我的 SendEmailActorSendEmailResult按预期返回 a 。但是测试单元失败了。我不知道为什么。SendEmailActor$SendEmailResult$和有什么区别SendEmailActor$SendEmailResult

0 投票
1 回答
213 浏览

scala - akka:以某些字段为模测试消息

我目前正在测试一个 akka 应用程序。我遇到了某种模式:我想测试 aTestProbe是否收到了某个消息,以某些字段为模。

例如,如果消息是:

然后我可能想测试usernameandscore是否符合预期,但不在乎何时收到消息。

目前我想写这样的东西:

如何扩展测试探针类以便可以编写类似的东西?

除了缩短我的代码之外,我希望这个问题的答案能进一步加深我对 Scala 编程语言的理解。

0 投票
1 回答
83 浏览

scala - 激活器的最小 akka-scala-seed 的 Specs2 测试有时会失败

我尝试使用scalatest和 specs2测试乒乓球示例(来自激活器的minimum-akka-scala-seed ) (我自己编写了 specs2 测试;见下文)。

最大规模的总是过去。但是,specs2 测试并非始终通过(即,如果我多次重新运行相同的测试)。当它失败时,它具有以下输出:

我实现的 specs2 测试如下(非常类似于minimum-akka-scala-seed 的测试文件夹中的 scalatest):

我的库依赖项如下:

有谁知道我在我的 specs2 测试中搞砸了哪里?

0 投票
3 回答
12684 浏览

scala - 如何测试客户端 Akka HTTP

我刚刚开始测试Akka HTTP Request-Level Client-Side API (Future-Based)。我一直在努力弄清楚的一件事是如何为此编写单元测试。有没有办法模拟响应并完成未来而无需实际执行 HTTP 请求?

我正在查看 API 和 testkit 包,试图了解如何使用它,只是在文档中找到它实际上说的:

akka-http-testkit用于验证服务器端服务实现的测试工具和实用程序集

我在想一些事情TestServer(有点像TestSourceAkka Streams 的),并使用服务器端路由 DSL 来创建预期的响应,并以某种方式将其连接到Http对象。

这是我要测试的功能的简化示例:

0 投票
1 回答
825 浏览

scala - Akka——测试监督策略

我有以下场景:父主管actor使用构造函数中传递的工厂(函数)为每条消息创建一个子节点。

在测试中,我覆盖了子 Receive 以强制异常。我的期望是因为我设定的监督策略,每次都会阻止儿童演员。

我希望由于 supervisorStrategy Stop 而停止子演员。相反,我收到此错误:

知道为什么会这样吗?谢谢

0 投票
1 回答
1156 浏览

scala - 找出 Play 使用的 Akka 版本

akka-testkit我需要添加对我的 Play的依赖!应用。我想避免硬编码 Akka 的版本并坚持使用 Play 使用的版本(以确保兼容性)。

是否可以获得我的版本build.sbt?我看到它列出的唯一地方是在 Play 的project/Dependencies.scala.

0 投票
2 回答
640 浏览

scala - 没有模拟的 Akka 单元测试策略

主要想法:我们如何对具有相当复杂业务逻辑的 Akka 演员进行单元测试(或重构以促进单元测试)?

我一直在我公司的一个项目中使用 Akka(一些非常基本的东西正在生产中),并且一直在不断重构我的演员,研究和试验 Akka 测试套件,看看我是否能做对......

基本上,我读过的大部分书都是随便说的“伙计,你需要的只是测试包。如果你使用的是模拟,那你就错了!!” 但是文档和示例非常简单,以至于我发现了许多未涵盖的问题(基本上,它们的示例是非常人为的类,它们具有 1 个方法并且不与其他参与者交互,或者仅以微不足道的方式,例如方法结束时的输入输出)。顺便说一句,如果有人可以向我指出具有任何合理复杂性的 akka 应用程序的测试套件,我将不胜感激。

在这里,我现在至少会尝试详细介绍一些具体案例,并且想知道人们会称之为“Akka 认证”方法(但请不要含糊其词……我正在寻找 Roland Kuhn 风格的方法论,如果他是曾经真正深入到具体问题)。我会接受涉及重构的策略,但请注意我对场景中提到的这一点的焦虑。

场景1:横向方法(在同一个actor中调用另一个方法)

所以,基本上这里我们有 2 个 fetch 方法,一个是单数,一个是多个。在单一情况下,测试很简单。我们设置了一个 TestActorRef,在构造函数中注入一些探针,并确保正确的消息链正在触发。

我在这里的焦虑来自于多重 fetch 方法。它涉及一个过滤步骤(仅获取有效的产品 ID)。现在,为了对此进行测试,我可以设置相同的场景(ProductActor 的 TestActorRef 用探针替换构造函数中调用的参与者)。但是,为了测试消息传递流,我必须模拟所有消息链接,不仅是对 FilterActiveProducts 的响应,而且是所有已经被先前的“getProductById”方法测试覆盖的消息链(那时不是真正的单元测试) , 是吗?)。显然,就必要的消息模拟量而言,这可能会失控,并且更容易验证(通过模拟?)这个方法只是为过滤器中幸存的每个 ID 调用。

现在,我知道这可以通过提取另一个参与者来解决(创建一个获取多个 ID 的 ProductCollectorActor,并简单地调用 ProductActor,并为每个通过过滤器的 ID 发出一个消息请求)。但是,我已经计算过了,如果我要对我拥有的每个难以测试的同级方法集进行这样的提取,我最终会为相对少量的域对象生成数十个参与者。样板开销的数量会很多,而且系统会相当复杂(更多的参与者只是执行本质上是一些方法组合)。

旁白:内联(静态)逻辑

我试图解决这个问题的一种方法是将内联(基本上任何不仅仅是一个非常简单的控制流的东西)移动到伴随对象或另一个单例对象中。例如,如果上述方法中有一个方法是过滤掉产品,除非它们匹配某种类型,我可能会执行以下操作:

这可以很好地单独进行单元测试,并且实际上可以允许测试非常复杂的单元,只要它们不调用其他参与者。我不喜欢把这些远离使用它们的逻辑(我应该把它放在实际的演员中然后通过调用底层演员进行测试吗?)。

总的来说,它仍然会导致一个问题,即在实际调用它的方法中进行更简单的基于消息传递的测试时,我基本上必须编辑我所有的消息期望以反映数据将如何被这些“静态”转换(我知道它们在 Scala 中在技术上不是静态的,但请耐心等待)方法。这我想我可以忍受,因为它是单元测试的一个现实部分(在一个调用其他几个的方法中,我们可能在存在具有不同属性的测试数据的情况下检查完形组合逻辑)。

这一切对我来说真正崩溃的地方就在这里——

场景 2:递归算法

所以是的,这里有一些伪代码,但要点是现在我们有一个递归方法(getProductId 在捆绑的情况下调用 getProductsById,它再次调用 getProductId)。通过模拟,我们可以在某些地方切断递归以使事情更可测试。但即使这样也很复杂,因为在方法中的某些模式匹配中存在参与者调用。

这对我来说真的是一场完美的风暴......将“bundle”案例的匹配提取到较低的actor中可能是有希望的,但这也意味着我们现在需要处理循环依赖(bundleAssembly actor需要typeSpecificActor,它需要bundleAssembly ...)。

这可以通过纯消息模拟来测试(创建存根消息,我可以在其中判断它们将具有什么级别的递归并仔细设计此消息序列),但是如果需要比单个额外参与者调用更多的逻辑,这将非常复杂且更糟捆绑类型。

评论

提前感谢您的帮助!我实际上对最小的、可测试的、精心设计的代码充满热情,并且我担心如果我尝试通过提取来实现所有目标,我仍然会遇到循环问题,仍然无法真正测试任何内联/组合逻辑并且我的代码将是对于微小的单一到极端责任演员来说,它比使用大量样板文件要冗长 1000 倍。本质上,代码都将围绕测试结构编写。

我对过度设计的测试也非常谨慎,因为如果他们正在测试复杂的消息序列而不是方法调用(我不确定除了使用模拟之外如何期待简单的语义调用),测试可能会成功但不会真的成功核心方法功能的真正单元测试。相反,它将只是代码(或消息传递系统)中控制流构造的直接反映。

所以也许是我对单元测试的要求太多了,但是如果你有一些智慧,请让我直截了当!

0 投票
2 回答
468 浏览

scala - 使用 ActorSelection 识别 Actor

我正在写一个Actor应该看另一个的Actor;让我们称后者为目标。一旦它的目标停止,我Actor应该停止自己。对于这个目标,我只有一个ActorSelection. 要观看它,我显然需要一个ActorRef,所以我想我应该发送ActorSelection一条Identify消息;当它回复时,ActorIdentity我会拥有它的ActorRef. 到目前为止一切顺利,但我无法让它工作。

这是规格:

和实现(一个FSM,细节跳过):

现在,当我运行测试时,它是绿色的,因为被测系统确实已停止。但问题是它会自行停止,因为使用上述步骤无法找到目标。日志文件说:

要求目标选择 ActorSelection[Anchor(akka://default/), Path(/system/testProbe-3)] 识别自己;messageId=871823258

找不到请求的目标 ActorSelection[Anchor(akka://default/), Path(/system/testProbe-3)]

我在这里遗漏了一些明显的东西吗?也许aTestProbe不应该透露其真实身份?我什至尝试将虚拟对象实例Actor化为目标,但结果是相同的。有什么线索吗?

0 投票
1 回答
418 浏览

scala - 如何不使用 ScalatestRouteTest 绑定到本地主机

我想测试路线ScalatestRouteTest如下:

运行测试时出现运行时错误:

无法运行测试 MyRoutesSpec:org.jboss.netty.channel.ChannelException:无法绑定到:/127.0.0.1:2552

我不想绑定到本地主机。如何实现?