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

Java 如果分布式P2P游戏可以处理100个连接,如何测试它?,java,testing,javafx,ui-testing,system-testing,Java,Testing,Javafx,Ui Testing,System Testing,在学校的一个大项目中,我们制作了著名的beergame的P2P变体。GUI是在JavaFX中构建的 我必须研究如何测试质量属性场景,如下所示: 100名玩家可以连接到游戏并进行游戏 通过GUI中的输入连接到游戏,玩家需要在GUI中输入主机(gameleader)的IP地址(如果通过WAN,则需要端口)。我们正在实现RAFT作为状态一致性算法 我做的第一步是研究创建100台客户机/计算机的最佳方法,不管你怎么称呼它。我很快得出结论,Docker是唯一一款可以同时运行100个容器的软件。我现在真正的

在学校的一个大项目中,我们制作了著名的beergame的P2P变体。GUI是在JavaFX中构建的

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

100名玩家可以连接到游戏并进行游戏

通过GUI中的输入连接到游戏,玩家需要在GUI中输入主机(gameleader)的IP地址(如果通过WAN,则需要端口)。我们正在实现RAFT作为状态一致性算法

我做的第一步是研究创建100台客户机/计算机的最佳方法,不管你怎么称呼它。我很快得出结论,Docker是唯一一款可以同时运行100个容器的软件。我现在真正的问题是如何在容器化环境中测试应用程序

我考虑过这一点,在每个容器上测试玩游戏流程的唯一真正方法是使用诸如TestFX之类的UI测试框架,通过为每个客户端设置的UI元素(每个客户端都需要使用不同的用户名加入游戏)

我已经找到了一个可以测试UI的框架,但是它需要一个带有图形界面的主机操作系统来运行(或者至少,这是我基于互联网上的简短搜索所做的假设)

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

为@Karol Dowbecki编辑 我们的通信方式是通过TCP/IP和UPnP每100ms发送一次序列化的appendentry(心跳),其中包含必须提交的更改(如果没有发生任何事情,则appendentry没有日志条目)。因此,如果一个玩家做了一个动作,它会向当时的领导者(gameleader/host)发送一个AppendEntry,然后将其转发回所有其他节点,并等待大多数节点将其发送回(两阶段提交),然后将其添加到每个玩家的日志条目列表(游戏的所有数据)。如果一个新玩家加入游戏,该玩家只需一次心跳(这是一个巨大的序列化json对象)即可收到该游戏存在的所有日志项,之后它会从下至上重新计算步骤(日志项),直到最后一个步骤(即玩家加入游戏)

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


此外,这些条目还会来回移动。每次玩家加入LogIndex(LogEntries的索引,基本上是发生了多少游戏状态更改的索引)时,它都会增加1,最终定义游戏状态中发生了多少更改。所以我并不是在来回发送静态信息。它随着每一个加入的玩家而改变。此外,当玩家“断开连接”时,这会再次影响LogIndex。我必须能够跟踪100人加入游戏并且仍然存在的事实。

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

如果您了解所使用的有线协议以及预期的播放器行为,您可以使用或创建测试计划。您可以使用来检查和记录客户端使用的有线协议


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

不幸的是,我的评论太长,因此我将其放在了我的原始帖子中。请参考。提前谢谢!