【问题标题】:How to test a long running Thread如何测试长时间运行的线程
【发布时间】:2015-11-06 21:15:02
【问题描述】:

我正在为我最后一年的项目开发一款多人游戏,目前正在开发服务器领域。在服务器中,我正在处理如下工作的移动区域

玩家进行移动 -> 将包含移动细节的数据包发送到服务器 -> 服务器将移动排队在包含在玩家对象内的队列中-> 服务器循环遍历所有连接的玩家 -> 服务器检查玩家的移动队列 -> 服务器更新玩家的位置 ->服务器将移动细节发送给其他客户端。

因此,为了实现这一点,我将拥有一个名为 MovementService 的 Runnable,它会在它们之间分配玩家队列。 runnable 的数量取决于资源,因为将每个玩家排队在一个线程上意味着很多延迟,因此至少会有 4 个 runnables,或者可以说是 4 个长时间运行的线程。这些可运行对象将被添加到 FixedThreadPool。

现在我的问题是我将如何测试这个实现,因为这是一个长期运行的线程,我不确定我将如何测试它,因为我之前发布了一个类似的问题,但答案建议我改变我的整个设计. Here 是个问题。答案中给出的方法无法在此处实现,因为我无法继续将服务器上收到的每个移动数据包的短可运行文件提交到 ThreadPool。

我的问题是我应该如何测试这个 Runnable 实现。有没有其他或更好的方法?

这是我的运动服务的相关代码

public class DefaultMovementService implements MovementService{

    @Override
    public void run() {
        while(isRunning){
            synchronized (playerQueue) {
                playerQueue.forEach(player -> move(player));
            }
        }
    }

    private void move(Player player) {
        //If player tank has movement, move the tank.
        //Send the movement to the other clients on the same map
    }
}

MovementService 接口扩展Runnable

【问题讨论】:

  • 我认为正确的方法是你不测试Runnable,它已经工作了。您在可运行文件之外的测试工具中测试 playerQueue
  • 你在哪里从 playerQueue 弹出任何东西?
  • 当玩家退出时,我在服务中有个方法 void removePlayer(Player player)。这可以完成工作。我这里没有将它包含在我的代码中。

标签: java multithreading unit-testing server


【解决方案1】:

您可以使用模拟框架 (EasyMock) 创建 playerQueue 的模拟并添加对应该调用的内容的期望。 下一件事:

   @Override
    public void run() {
        while(isRunning){
            synchronized (playerQueue) {
                playerQueue.forEach(player -> move(player));
            }
        }
    }

这个while running 是这个任务非常容易出错的方法。 创建一个计划线程池并提交此任务以某个固定速率(例如 10 毫秒)运行并删除 while(isRunning);您可以通过调用ScheduledFutute<?> future.cancel(false);来取消计划任务

【讨论】:

  • 是的,我确实使用了一个模拟框架,并且我确实使用了您在链接问题中指定的技术,但问题是我不能在这里做到这一点。看到这个stackoverflow.com/questions/33426494/…我也不确定预定池在这里是如何工作的。
  • 好吧,您只需要通过设计或实现使您的代码更易于测试。这是编程世界中一个非常普遍的问题,开发人员往往不会考虑他们代码的可测试性,但有时他们甚至无法确定他们的代码是否正常工作。考虑一下,您将长期受益。
  • 这就是我问这个问题的原因,我可以使用这个实现,因为我知道它会起作用,但从长远来看,我想正确测试它并因此寻找更好的实现:) @Zpetkov
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-28
  • 1970-01-01
  • 2019-06-24
  • 1970-01-01
  • 2011-08-17
  • 1970-01-01
相关资源
最近更新 更多