Akt.net演员的UnitTesting

时间:2014-09-02 14:39:05

标签: unit-testing akka.net

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

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

是否有人(特别是来自markedup.com的人)找到了为演员进行单元测试的方法?

4 个答案:

答案 0 :(得分: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移植的规范,应该给出一些关于如何测试actor系统的好例子。

例如,请参阅:https://github.com/akkadotnet/akka.net/blob/dev/src/core/Akka.Tests/Actor/ActorLifeCycleSpec.cs#L116

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

Akka.TestKit用作基类,允许您实例化Sys.ActorOf。根据链接,这实际上是一个假的ActorSystem,我正在创建一个假的CommandBus(帖子底部的例子),一个非常小的ReceiveActor,它只捕获被测试的SignalProcessorExit类发送的任何消息(由模拟的TestActor将任何消息发送回自身)。然后可以检查消息的内容以测试actor的行为(所以我不是在实际的actor本身内部窥视,只是验证它的行为)。我最初发现这个计数器很直观,但是一旦你习惯了TestActor如何工作,事情变得更加简单。

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

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

答案 3 :(得分:0)

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

我可能会因为我从演员开始而拒绝这一点,但这对我来说并不合适。我希望/需要单独测试我的演员的方法,而不是作为系统的一部分。

所以我到目前为止所做的是将 actor和state 的逻辑部分带走,我可以随意进行单元测试,并在该类中拥有该类的实例。真正的akka​​演员。如果你想抽象它,你甚至可以映射和方法属性。

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

虽然测试演员作为系统的一部分是有道理的,但我的单元测试要求与此相冲突。

  

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

所以我按照我的解释,提取了一个逻辑类,用不同的方法处理每个消息类型。我可以测试数据处理,我可以改变状态并测试状态比较方法。那种方式更清洁。

最后,如果你正在玩akka,你需要使用TestKit。你会想要测试演员的完整行为。但是我仍然需要进行更细粒度的测试,并且想知道为什么不能让新的演员做到这一点(虽然我不应该在测试环境中完成它)。