【问题标题】:How to test drive a networking application with custom protocol?如何使用自定义协议测试驱动网络应用程序?
【发布时间】:2009-11-05 15:49:30
【问题描述】:

我目前正在为学校项目开发两个 Java 网络应用程序。一个通过 TCP,另一个通过 UDP。在这两种情况下,我都必须实现简单的自定义协议。

尽管我非常努力,我还是找不到正确测试此类应用程序的方法,或者通过测试优先开发更好地进行开发

如果我有一个客户端并且我想要真正的测试而不把所有东西都存根,我必须实现具有模拟行为的服务器,对于像这样的简单应用程序来说,这几乎是整个项目。我知道,当一些大的事情发生时,比编写几行 Perl 脚本来测试它真的很有帮助。

现在我正在同时开发服务器和客户端,这样我至少可以手动测试,但这似乎不是一种干净的开发方式。唯一有帮助的是通过记录器建立隧道连接,这样我就可以看到通过的所有数据(使用 TunneliJ IDEA 插件)。

使用自定义协议对网络应用程序进行 TDD 的最佳方式是什么?我应该把所有的东西都存起来就可以了吗?

【问题讨论】:

    标签: java unit-testing networking tdd integration-testing


    【解决方案1】:

    将协议与网络层分离。一旦您可以将自己的数据提供给它,而无需通过网络堆栈,测试协议的逻辑将变得更加容易。即使您没有使用 Python,我还是建议您查看 Twisted 框架的结构。这是如何对网络应用程序进行单元测试的一个很好的例子。

    【讨论】:

    • 松耦合始终是答案:)
    【解决方案2】:

    我们不久前遇到了同样的问题。我们决定让两名开发人员负责这项任务会更简单:一名编写服务器,另一名编写客户端。我们开始在同一个办公室工作,这样我们就可以更轻松地编码、测试、修改和重复。

    总而言之,我认为这对我们来说是最好的解决方案。它使我们能够在不理想的条件下实际测试程序。例如,我们的互联网中断了几次,我们的程序崩溃了,所以我们修复了它。它对我们来说效果很好,但如果你是一个单独的开发者,它可能不适合你。

    无论您做什么,在编写自定义协议时,我都会检查 Wireshark 以监控您的网络流量,以确保所有数据包都是正确的。

    【讨论】:

      【解决方案3】:

      在我的应用中,我有这样的代码

          m_socket.receive(packet);
      
          doSomething(packet);
      

      我模拟了接收,因此可以执行 doSomething() 需要做的所有事情。

      这对您来说在哪里分解?在这里,您真正单元测试您的代码行为是否正确,您还可以模拟套接字发送,并根据您的协议确定您认为应该发送的内容的期望。

      我们当然不会真正测试协议的另一端是否满意。那就是集成测试。我总是渴望尽快进入 IT 领域。当您与“另一端”互动时,您会发现有趣的东西。

      你处于控制两端的幸运位置,在那个位置上,我可能会花一些时间来创建合适的、可控的测试工具。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-03
        • 2011-10-20
        • 2019-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-07
        相关资源
        最近更新 更多