多节点测试

多节点测试

模块信息

要使用多节点测试,必须在项目中添加以下依赖项:

多节点测试概念

当我们谈论Akka中的多节点测试时,是指在不同JVM中的多个actor系统上运行协调测试的过程。多节点测试套件包括三个主要部分。

-测试协调。协调和控制被测节点。
-多节点规范。这是启动TestConductor,并让所有节点连接到它的封装。
-SbtMultiJvm插件。在多台机器上的多个JVM中启动测试。

测试协调

多节点测试的基础是TestConductor。它是一个Akka扩展插件,可插入网络堆栈,用于协调参与测试的节点,并提供以下功能:

-节点地址查找:查找到另一个测试节点的完整路径(无需在测试节点之间共享配置)
-节点屏障协调:在命名的屏障处等待其他节点。
-网络故障注入:限制流量,丢弃数据包,拔出并重新插入节点。
这是测试协调的示意图。

多节点测试_第1张图片

测试协调服务器负责协调屏障,并向作用在屏障上的测试协调客户端发送命令。限制与其他客户端之间的网络流量。有关可能的操作的更多信息,请参见akka.remote.testconductor.ConductorAPI文档。

多节点规范

多节点规范包括两部分。MultiNodeConfig负责通用配置、枚举和命名被测节点。MultiNodeSpec包含许多便利功能,用于使测试节点相互交互。有关可能的操作的更多信息,请参见akka.remote.testkit.MultiNodeSpecAPI文档。

通过在要运行被测节点的所有JVM上设置的java系统属性来配置MultiNodeSpec。可以在JVM命令行上使用-Dproperty=value设置这些值。

这些是可用的属性
-multinode.max-nodes测试可以具有的最大节点数。
-multinode.host此节点的主机名或IP。必须使用InetAddress.getByName可解析。
-multinode.port此节点的端口号。默认为0,它将使用随机端口。
-multinode.server-host服务器节点的主机名或IP。必须使用InetAddress.getByName可解析。
-multinode.server-port服务器节点的端口号。默认为4711
-multinode.index在为测试定义的角色序列中此节点的索引。索引0是特殊的,该机器将是服务器。所有故障注入和限流必须从此节点完成。

SbtMultiJvm插件

SbtMultiJvm插件已更新,可以通过自动生成相关的multinode.*属性来运行多节点测试。这意味着您可以将它们作为普通的多jvm测试运行,而无需任何特殊配置就可以在一台计算机上运行多节点测试。然后,通过使用插件的多节点添加,无需进行任何更改可以在多台计算机上分布式运行这些测试。

多节点特定添加

该插件还具有许多新的multi-node-*sbt任务和设置,以支持在多台计算机上运行测试。将必要的测试类和依赖项打包为分发到其他具有SbtAssembly的计算机上的jar文件,其名称格式为_--multi-jvm-assembly.jar

注意
为了能够在多台计算机上分发和启动测试,假定主机和目标系统都是POSIX系统,并且具有ssh和rsync。

这些是可用的sbt多节点配置
-multiNodeHosts,用于运行测试的一系列主机,格式为user@host:java,其中host是唯一必需的部分。将覆盖文件中的设置。
-multiNodeHostsFileName,一个文件,用于读取运行测试的主机。每行一个,格式与上述相同。默认为基础项目目录中的multi-node-test.hosts。
-multiNodeTargetDirName,目标计算机上将jar文件复制到的目录的名称。在用于rsync jar文件的ssh用户的基本目录中,默认值为multi-node-test。
-multiNodeJavaName目标计算机上默认Java可执行文件的名称。默认为java。

以下是一些如何定义主机的示例

  • localhost使用默认java的localhost上的当前用户。
  • user1@host1主机host1上的用户user1,默认Java。
  • user2@host2:/usr/lib/jvm/java-7-openjdk-amd64/bin/java使用Java7的主机host2上的用户user2。
  • host3:/usr/lib/jvm/java-6-openjdk-amd64/bin/java使用Java6的主机host3上的当前用户。

运行多节点测试

要从sbt内部以多节点模式运行所有多节点测试(即分发jar文件并远程启动测试),请使用multiNodeTest任务:

multiNodeTest

要以多jvm模式(即本地计算机上的所有JVM)运行它们,请执行以下操作:

multi-jvm:test

要运行单个测试,请使用multiNodeTestOnly任务:

multiNodeTestOnlyyour.MultiNodeTest

要以多jvm模式运行单个测试,请执行以下操作:

multi-jvm:testOnlyyour.MultiNodeTest

可以列出多个测试名称来运行多个特定测试。sbt中的制表符补全使完成测试名称变得容易。

多节点测试示例

首先,我们需要一些脚手架,以将MultiNodeSpec与您喜欢的测试框架连接起来。 让我们定义一个接口STMultiNodeSpec,该接口使用ScalaTest启动和停止MultiNodeSpec。

然后,我们需要定义一个配置。 让我们使用两个节点"node1和"node2",并将其称为MultiNodeSampleConfig。

然后最后到节点测试代码。 这将启动两个节点,并演示一个障碍,以及一个远程actor消息发送/接收。

注意事项

编写多节点测试时,需要牢记两点,否则测试的行为可能会令人惊讶。

  • 不要关闭第一个节点。第一个节点是控制器,如果关闭,测试将失败。
  • 为了能够使用blackhole,passThrough和限流,必须通过在MultiNodeConfig中指定testTransport(on = true)来激活故障注入和节流传输适配器。
  • 节流,停机和其他故障注入只能从第一个节点(也就是控制器)进行。
  • 节点关闭后,不要使用node(address)来请求节点的地址。在关闭节点之前先获取地址。
  • 不要从其他线程而不是主测试线程,使用诸如地址查找,障碍物等MultiNodeSpec的方法。这也意味着您不应该在actor,future或scheduled task中使用它们。

配置

多节点测试模块有多个配置属性,请参考参考配置。

你可能感兴趣的:(akka)