你如何对TCP服务器进行单元测试?它甚至值得吗?

时间:2009-04-12 16:12:20

标签: .net unit-testing tdd tcp

我正在开发一个小型TCP服务器,它将处理一些TCP数据包,并根据请求采取不同的行为。

如何为此编写单元测试?如果真的很难写,那还值得努力吗?

8 个答案:

答案 0 :(得分:17)

我尝试从处理位中提取特定于TCP的位。您的协议真的是基于数据包,还是基于流?如果它是基于流的,你可以让处理部分接受一个流(或者可能是一对流,一个用于输入,一个用于输出),并用MemoryStream或你自己的类似流实现提供一个流。更多的控制。

无论哪种方式,你基本上都想模拟网络方面的东西,这样你就可以测试真正的逻辑而不需要让网络参与其中。测试网络层(即框架网络类和处理逻辑之间的薄层逻辑)可能会有点困难,但如果你能够让它足够薄,那么测试就不会太多了。

答案 1 :(得分:9)

要做的第一件事是将行为与传入的TCP数据包分开。摘要进入调度表或其他类似的东西。

然后为每个行为编写单元测试,而不管它们是如何被调用的。你可以测试最终的TCP - >使用您编写或借用的测试工具的行为层。如果代码被正确考虑,该层应该几乎是微不足道的。

答案 2 :(得分:4)

非常值得。

单元测试的数量应与请求的类型(不同的行为)一致。当您进行修改并查看它是否影响TCP服务器的其他部分时,这将非常有用。

你可以模仿发送带有几个可用工具的TCP数据包。让我知道它是怎么回事。

答案 3 :(得分:4)

如果您编写TCP服务器,您还应该编写客户端库。除非您正在做一些奇特的事情,否则您只需在单元测试和存根服务器之间的环回适配器上发送数据包。您只需要验证您是否正在使用这些测试正确地执行TCP,因为其他测试应以适当的单元测试方式存根/跳过TCP /套接字逻辑并直接跳转到正在测试的单个单元。

完成所有这些是完全值得的。如果你对TCP足够新,你不确定应该如何以及为什么要对它进行单元测试,那么你可能会在编写TCP代码时犯一些错误/错误的假设,单元测试对于调用是非常宝贵的。那个。您还会发现它鼓励您更多地关注客户的需求,从而产生更清晰的协议和更清晰的服务器代码库。

答案 4 :(得分:2)

我对.net一无所知,但我可以告诉你有关单元测试的信息。

你需要考虑事情。例如,您的服务器可能在一个线程中运行并做一些工作。在哪里工作应该在一个功能内。您也可能有一个请求对象。使tcp服务器的“工作函数”将请求对象作为参数。然后像往常一样进行单元测试:在测试开始时,设置请求,并将其传递给tcp服务器对象的“工作函数”。实际上没有服务器打开套接字或任何东西。您只是对执行工作的方法进行单元测试,并且仅测试请求的处理。您测试套接字或网络可靠性或类似的东西。你需要以不同的方式测试这些东西。

答案 5 :(得分:2)

您可以查看NMock,一个.NET的模拟库。如果双方参与单元测试,那么“模拟”一方(您未测试的那方,在这种情况下是客户端)总是好的。

然而,这需要对您的代码进行一些更改,但请相信我,这是值得的。

答案 6 :(得分:2)

我不能给你任何具体的帮助,因为你的问题是相当开放的。

然而,听起来好像你想根据自己的需要编写一个模拟服务器/客户端。值得一看Rhino Mocks

您可能还想看一下使用自定义TCP / IP实现实现缓存服务器的Oren NMemCached project。该项目有一些使用Rhino Mocks编写的有趣的单元/集成测试。

答案 7 :(得分:2)

这当然值得努力。对于我正在研究的基于HTTP小型服务器的应用程序,我所使用的是一系列脚本,可以使用 wget 在服务器上触发请求。然后我使用 diff 来比较保存的wget输出和我期望获得的输出,并报告任何小数。我每次更换服务器时都运行这一堆脚本,并且它遇到了很多错误。

显然,这仅适用于HTTP服务器,但是编写一个可以在服务器上触发TCP请求并保存结果的小应用程序是值得的。