共计 2782 个字符,预计需要花费 7 分钟才能阅读完成。
多节点测试
模块信息
要应用多节点测试,必须在我的项目中增加以下依赖项:
多节点测试概念
当咱们议论 Akka 中的多节点测试时,是指在不同 JVM 中的多个 actor 零碎上运行协调测试的过程。多节点测试套件包含三个次要局部。
- 测试协调。协调和管制被测节点。
- 多节点标准。这是启动 TestConductor,并让所有节点连贯到它的封装。
-SbtMultiJvm 插件。在多台机器上的多个 JVM 中启动测试。
测试协调
多节点测试的根底是 TestConductor。它是一个 Akka 扩大插件,可插入网络堆栈,用于协调参加测试的节点,并提供以下性能:
- 节点地址查找: 查找到另一个测试节点的残缺门路(无需在测试节点之间共享配置)
- 节点屏障协调: 在命名的屏障处期待其余节点。
- 网络故障注入: 限度流量,抛弃数据包,插入并从新插入节点。
这是测试协调的示意图。
测试协调服务器负责协调屏障,并向作用在屏障上的测试协调客户端发送命令。限度与其余客户端之间的网络流量。无关可能的操作的更多信息,请参见 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 文件,其名称格局为 <projectName>_<scalaVersion>-<projectVersion>-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 中应用它们。
配置
多节点测试模块有多个配置属性,请参考参考配置。