如果分布式P2P游戏可以处理100个连接,该如何测试?

时间:2019-01-12 22:24:14

标签: java testing javafx ui-testing system-testing

对于学校的一个大型项目,我们制作了著名啤酒游戏的P2P变体。 GUI是用JavaFX构建的。

我必须研究如何测试质量属性方案,如下所示:

100个玩家可以连接并玩游戏。

通过GUI中的输入连接游戏,玩家需要在该输入中放置主机(游戏负责人)的IP地址(如果通过WAN,则带有端口)。我们正在将RAFT实现为状态共识算法。

我所做的第一步是研究创建100个客户端/计算机的最佳方法,但是您想调用它。我很快得出一个结论,即Docker是唯一可以同时运行100个容器的软件。我现在真正的问题是如何在容器化环境中测试应用程序。

我考虑过这一点,并且测试在每个容器上玩游戏的流程的唯一真实方法是遍历UI元素,并为每个客户端设置其他设置(每个客户端都需要使用不同的用户名加入游戏)。一种UI测试框架,例如TestFX。

我已经找到了一个框架,可以让您测试UI,但是它需要具有图形界面的主机OS才能起作用(或者至少是我基于对Internet的简短搜索而得出的假设)。

在IntellJ本身中也许有一种方法可以做到这一点。为游戏创建100个容器,每个容器都有一个唯一的IP地址,以便它们可以连接到游戏主机。

编辑@Karol Dowbecki

我们交流的方式是使用UPnP在TCP / IP上每100毫秒发送序列化的AppendEntries(心跳),其中包含必须提交的更改(如果什么都没有发生,则该附件没有登录项)。因此,如果玩家执行某项操作,它将在该时刻向其领导者(游戏领导者/主机)发送一个AppendEntry,然后将其中继回所有其他节点,并等待大多数节点将其发送回(两阶段)提交),然后将其添加到每个玩家的登录条目列表(游戏的所有数据)。如果有新玩家加入该游戏,则该玩家只需1个心跳即可接收该游戏存在的所有logEntries,这是一个巨大的序列化json对象,其后从下到上重新计算步骤(logEntries),直到最后一个,即玩家加入了游戏。

那么您的建议是捕获通过网络传输的这些序列化的appendEntries,反序列化它们并将其与预期结果进行比较?如果我必须扫描每个AppendEntry,将非常困难,因为每个客户端每秒将10个发送给领导者(如果客户端是玩家),将10个发送给所有节点(如果客户端是领导者/主机)

AppendEntries也来回移动。每次玩家加入LogIndex(LogEntries的索引,基本上是发生了多少游戏状态更改的索引)都会增加1,这最终定义了游戏状态中发生了多少更改。因此,并不是我要来回发送静态信息。它随着每个加入玩家而变化。同样,当玩家“断开连接”时,这也会再次影响LogIndex。我必须能够跟踪100个人仍然参加比赛的事实。

1 个答案:

答案 0 :(得分:0)

您不必创建游戏的100个实例。这样做会带来很大的不利影响,通过编写客户端UI脚本很难知道瓶颈是在客户端还是在服务器中(Coordinated Omission问题)。

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

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