11

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

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

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

4

4 回答 4

10

[编辑] 现在有一篇关于如何使用 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

于 2014-09-08T14:21:27.357 回答
2

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

于 2015-11-17T01:35:49.077 回答
1

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

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

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

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

于 2017-03-23T23:40:13.400 回答
0

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

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

所以到目前为止我一直在做的是去掉actor的逻辑部分和另一个我可以随意单元测试的类中的状态,并在真正的akka​​actor中拥有那个类的实例。如果您想将其抽象出来,您甚至可以映射和方法属性。

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

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

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

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

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

于 2016-02-25T11:12:25.383 回答