对于学校的一个大型项目,我们制作了著名啤酒游戏的 P2P 变体。GUI 内置在 JavaFX 中。
我必须研究如何测试质量属性场景,如下所示:
100 名玩家可以连接到游戏并进行游戏。
通过 GUI 中的输入连接到游戏,玩家需要在其中输入主机(游戏领导者)的 IP 地址(如果它通过 WAN,则带有端口)。我们正在实施 RAFT 作为状态共识算法。
我所做的第一步是研究创建 100 个客户端/计算机的最佳方法,但你想怎么称呼它。我很快得出结论,Docker 是唯一可以同时运行 100 个容器的软件。我现在真正的问题是如何在容器化环境中测试应用程序。
我考虑了一下,测试在每个容器上玩游戏的流程的唯一真正方法是使用某种 UI 为每个客户端遍历 UI 元素以及其他设置(每个客户端需要使用不同的用户名加入游戏)像TestFX这样的测试框架。
我找到了一个可以让您测试 UI 的框架,但它需要一个具有图形界面的主机操作系统才能运行(或者至少,这是我基于互联网上的简短搜索得出的假设)。
有没有办法在 IntellJ 本身中做到这一点。使用游戏创建 100 个容器,每个容器都有一个唯一的 IP 地址,以便它们可以连接到游戏主机。
编辑@Karol Dowbecki
我们通信的方式是每 100 毫秒通过 TCP/IP 使用 UPnP 发送序列化的 AppendEntries(heartbeats),其中包含必须提交的更改(如果没有发生任何事情,则 appendentry 没有 logentries)。因此,如果玩家执行操作,它会向当时的领导者(游戏领导者/主机)发送一个 AppendEntry,然后将其转发回所有其他节点并等待大多数节点将其发送回来(两阶段commit),然后将其添加到每个玩家的登录列表(游戏的所有数据)中。如果有新玩家加入游戏,该玩家只需 1 个心跳就收到该游戏存在的所有 logEntries,这是一个巨大的序列化 json 对象,之后它从下往上重新计算步骤(logEntries)直到最后一个,即加入游戏的玩家。
那么您的建议是捕获这些通过网络传输的序列化附加条目,将它们反序列化并将其与预期结果进行比较?如果我必须扫描每个 AppendEntry 将非常困难,因为每个客户端每秒发送 10 个给领导者(如果客户端是玩家)和 10 个给所有节点(如果客户端是领导者/主机) .
AppendEntries 也来回走动。每次玩家加入 LogIndex(LogEntries 的索引,基本上是发生了多少游戏状态变化的索引)都会增加 1,最终定义了游戏状态发生了多少变化。所以不是我来回发送静态信息。它随着每个加入的玩家而变化。同样,当玩家“断开连接”时,这会再次影响 LogIndex。我必须能够跟踪 100 人加入游戏并且仍然在那里的事实。