如何测试Akka Persistence actor

5

我正在开发一个基于Akka Persistent FSM的项目。特别是:

  1. 我想知道为了保证测试用例的独立性,最好的结构方式是什么?由于状态更改是持久化的(这在文档中没有很好地解释,但可以在这里看到),因此确保我的持久化actor始终处于干净状态可能会很棘手。是否需要手动将重置构建到我的actor FSM协议中?如果是这样,这似乎不太理想,因为它是需要单独测试的新行为。

  2. 在测试中如何管理日志本身?有没有一种简单的方法来配置使用不同的日志记录器进行测试,而不必在actor设计本身中显式进行此选择?文档中的Plugin TCK部分提到手动删除整个日志文件。这对于测试插件本身似乎是合理的,但对于应用程序代码来说,这似乎是一种不必要的低级解决方案。也许我需要显式调用日志记录器的asyncDeleteMessagesTo来进行测试拆卸?这仍然似乎是非常低级的,但也许它只是尚未集成到库中的基础设施。

1个回答

10

当对持久化Actor进行单元测试时,您可以使用一个内存中的持久化插件,例如 https://github.com/dnvriend/akka-persistence-inmemory

不需要进行任何代码更改,只需在src/test/resources目录下使用一个不同于src/main/resources中的application.conf即可。

为了保证单元测试之间的独立性,您可以将persistenceId注入到Actor中,并针对每个测试创建一个具有不同persistenceId的新Actor实例。这样,即使先前测试中存在的事件仍然存在于内存中,它们也不会影响后续的测试。

如果您使用Akka testkit,则每次运行测试都会创建一个新的Actor系统。当系统关闭时,inmemory日志的内容将被销毁,因此无需手动清理。


1
非常有信息量 - 我会继续使用这种方法。我需要从我的主要 application.conf 中复制所有内容吗,还是只需提供覆盖项即可?目前,我只在进行日志配置,但我想提前了解一下,以备将来添加更多配置时使用。我不太喜欢注入 persistenceId 的概念,但如果那是我能做的最好的选择,那就这样吧。 - acjay
@mattinbits,您能否提供一个无需手动清理日志的示例?这是否由内存插件处理? - SaKou
@SaKou 这是因为它是"内存中"的本质。一旦进程结束,该进程的内存就不会持续存在。 - mattinbits
你能为我提供一些有关此事的优势链接吗? - SaKou

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接