【问题标题】:UnitTesting for Akka.net ActorsAkka.net Actors 的单元测试
【发布时间】:2014-10-26 21:01:54
【问题描述】:

我正在试用 Akka.net。到目前为止,我刚刚创建了一个简单的 HelloWorld 风格的应用程序。 通常我在开发中使用 TDD 方法,但使用 Akka.net 我不知道从哪里开始我的单元测试。

经过一番谷歌搜索后,我意识到原来的 Java/Scala Akka 框架使用了一个专用模块 akka-testkit,这似乎在 .Net 端口中不可用。

有没有人(尤其是来自markup.com 的人)找到了对演员进行单元测试的方法?

【问题讨论】:

    标签: unit-testing akka.net


    【解决方案1】:

    我一直在使用 Akka.NET 开发一个交易平台,我的测试套件是用 xUnit2 框架编写的,并实现了 Akka.NET TeskKit。

    Akka.TestKit 用作允许您实例化 Sys.ActorOf 的基类。根据链接,这实际上是一个假的 ActorSystem,我正在创建一个假的 CommandBus(帖子底部的示例),一个非常小的 ReceiveActor,它只捕获被测试的 SignalProcessorExit 类发送的任何消息(由TestActor 将任何消息发送回自身)。然后可以检查消息的内容以测试参与者的行为(所以我不是在查看实际参与者本身,而只是验证它的行为)。最初我发现这与直觉相反,但一旦你习惯了 TestActor 的工作方式,事情就会变得更简单。

    构造函数正在为每个测试生成一个Fresh Fixture,其中包括拆除和重建 Sys.ActorOf 测试 ActorSystem。

    我在这里使用 ExpectNoMsg() 和 ExpectMsg(T) 来抓取 TestActor 收到的消息并根据它进行断言。

    【讨论】:

      【解决方案2】:

      使用TestKit 似乎是推荐的“官方”做法。但是您只能测试参与者的完整行为,作为“假”系统(测试系统)的一部分。

      我可能只是因为我从演员开始而拒绝这样做,但这对我来说感觉不对。我想要/需要单独对我的演员的方法进行单元测试,而不是作为系统的一部分。

      所以到目前为止,我一直在做的是在另一个我可以随意单元测试的类中删除 actor 和 state 的逻辑部分,并在真正的阿卡演员。如果您想将其抽象出来,您甚至可以映射和方法属性。

      我在 Scala 上看到这里推荐给 akka:How to test a public method in an akka actor?,但它适用于 akka.net。

      虽然将参与者作为系统的一部分进行测试是有意义的,但我的单元测试要求与此冲突。

      我的例子:我正在创建一个从网络接收数据的演员 调用,并在数据以特定方式发生变化时更新 UI。现在 使用TestKit 测试数据处理的常用方法是 需要我让演员用他的新数据回答消息 (一开始不是我的意图),或者为每次更改打多个电话 场景 - 然后将结合测试数据处理 与状态比较。我不喜欢只是改变行为 允许测试或测试演员的 2 个或更多不同部分。

      所以我按照我的解释做了,提取了一个逻辑类,它以不同的方法处理每种消息类型。我可以测试数据处理,我可以改变状态和测试状态比较方法。这样干净多了。

      最后,如果你在玩 akka,你确实需要使用TestKit。您需要测试演员的全部行为。但是我仍然需要更细粒度的测试,并且想知道为什么新演员不可能做到这一点(尽管我知道它永远不应该在测试环境之外完成)。

      【讨论】:

        【解决方案3】:

        [编辑] 现在有一个更完整更好的关于如何使用 Akka.NET 进行单元测试的帖子https://petabridge.com/blog/how-to-unit-test-akkadotnet-actors-akka-testkit/

        [旧] Akka.Testkit 已被移植,我们的目标是很快在 Nuget 上发布它。 如果你想尝试一下,你必须从https://github.com/akkadotnet/akka.net下载源代码

        最好的入门方法是在 Akka.NET 中检查我们自己的单元测试。 有一些使用 Akka.Testkit 从 JVM 移植的规范,应该提供一些关于如何测试参与者系统的好例子。

        例如查看:https://github.com/akkadotnet/akka.net/blob/dev/src/core/Akka.Tests/Actor/ActorLifeCycleSpec.cs#L116

        【讨论】:

          【解决方案4】:

          我目前正在为TestKit 编写文档(下周应该会上线),但在此期间,我建议您查看this thorough intro to the TestKit。它涵盖了核心和高级 API 功能,包括如何测试各种层次结构模式、异步调用、虚拟时间、预定消息等(披露:我写的)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-02-20
            • 1970-01-01
            • 2017-02-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多