-1

对于学校的一个大型项目,我们制作了著名啤酒游戏的 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 人加入游戏并且仍然在那里的事实。

4

1 回答 1

0

您不必创建 100 个游戏实例。这样做会有一个相当大的缺点,通过编写客户端 UI 脚本很难判断瓶颈是在客户端还是在服务器中(协调遗漏问题)。

如果您了解所使用的有线协议以及预期的玩家行为是什么,您可以使用Apache JMeterGatling创建测试计划。您可以使用Wireshark来检查和记录客户端使用的有线协议。

这不会创造真正的玩家体验,但只要你能重现最受欢迎的玩家的动作,它就足以对服务器进行压力测试。提到的框架还将具有许多功能,可以帮助您发现问题,例如在一段时间内增加和减少连接,绘制结果等。

于 2019-01-12T22:45:34.610 回答