2009-04-12 33 views

回答

9

首先要做的是将行为从传入的TCP数据包中分离出来。抽象成调度表或其他类似的东西。

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

4

这将是非常值得的。

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

你可以模仿发送TCP数据包与几个可用的工具。让我知道事情的后续。

+0

您推荐哪种工具?我计划获得TypeMock许可证,但我不确定它是否支持它。 – 2009-04-12 16:19:45

+0

你必须使用一些其他的工具用于此目的的类似 http://www.netscantools.com/nstpro_packet_generator_tcp.html – 2009-04-12 16:23:43

2

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

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

2

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

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

17

我想尝试从处理位中提取TCP特定的位。你的协议真的是基于数据包,还是基于流?如果它是基于流的,您可以让处理部分接受一个流(或可能是一对流,一个用于输入,另一个用于输出),并将其与MemoryStream或您自己的类似流实现一起提供更多控制权。无论哪种方式,你基本上都想嘲笑事物的网络方面,所以你可以测试真正的逻辑而不需要涉及网络。测试网络层(即框架网络类和处理逻辑之间的一小段逻辑)可能会有点困难,但如果您可以使其足够薄,则测试应该不会太多。

+1

好一点,他应该围绕这两个抽象出两者的数据包分析,逻辑,把单元测试。使用业务逻辑接口,然后使用模拟库可以分离解析代码。 – 2009-04-13 05:32:27

2

我不能给你任何特定的帮手,因为你的问题是相当开放的。

然而,它听起来好像你想写一个模拟服务器/客户端取决于您的需求。这是值得看看Rhino Mocks

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

2

这当然是值得的努力。我正在为基于HTTP小型服务器=基于应用程序的圆顶提供一系列脚本,这些脚本在服务器上使用wget来触发请求。然后,我使用diff将保存的wget输出与我期望得到的内容进行比较,并报告任何fifferences。我每次更换服务器时都运行这些脚本,并且发现了很多错误。

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

4

如果你编写一个TCP服务器,你也应该写一个客户端库。除非你喜欢做一些事情,否则你可以简单地通过单元测试和存根服务器之间的环回适配器来发送数据包。您只需要验证您是否正确地使用这些测试来完成TCP,因为其余测试应该以适当的单元测试方式存根/跳过TCP /套接字逻辑,并直接跳入正在测试的单个单元。

做这一切是完全值得的。如果你足够新到TCP,你不知道如何以及为什么你应该单元测试它,你可能会犯一些错误/错误的假设,你如何编写你的TCP代码,单元测试对于调用是非常宝贵的那个。你也会发现它鼓励你更多地关注客户的需求,这往往会导致更清晰的协议和更清洁的服务器代码库。

相关问题