C# 如何对tcp连接进行单元测试?

C# 如何对tcp连接进行单元测试?,c#,unit-testing,tcp-ip,C#,Unit Testing,Tcp Ip,最近我有机会为我的一个项目编写一个简单的tcp客户端,由于我对tcp/ip的无知,我很难让它正常工作 我发现,当tcp服务器关闭而连接被拒绝时,有时会出现奇怪的连接问题,或者有时调用receive时可能会出现异常 由于tcp服务器是一个黑匣子,我们无法访问它,我想知道在这种情况下,为它编写单元测试的最佳方法是什么 我在想,要么我应该编写一个tcp服务器,让它像我期望的那样从实际服务器返回某些输入,要么只是模拟与返回理想情况数据相关的函数 我只是不喜欢这样的事实,有时我可能会遇到奇怪的连接/接收问

最近我有机会为我的一个项目编写一个简单的tcp客户端,由于我对tcp/ip的无知,我很难让它正常工作

我发现,当tcp服务器关闭而连接被拒绝时,有时会出现奇怪的连接问题,或者有时调用receive时可能会出现异常

由于tcp服务器是一个黑匣子,我们无法访问它,我想知道在这种情况下,为它编写单元测试的最佳方法是什么

我在想,要么我应该编写一个tcp服务器,让它像我期望的那样从实际服务器返回某些输入,要么只是模拟与返回理想情况数据相关的函数

我只是不喜欢这样的事实,有时我可能会遇到奇怪的连接/接收问题,我想知道如何正确地编写单元测试,我可以在将来重用/扩展它,以确保在我的代码或它们的代码发生更改时,以前可以工作的一切都应该仍然工作


感谢单元测试,我将创建一个简单的套接字服务器(在UT启动时启动),仅用于测试客户端。如果您使它变得简单和独立,您将减少运行测试的麻烦。您还可以使用诸如ncat之类的工具来实现这一点


然而,尽管如此,UT可能更难发现一些问题。保留问题,可能是路由等外部问题。但是,如果您使用的是真正的侦听套接字(而不是模拟连接),那么它就是真正的TCP。

您应该有两种测试:

  • 集成测试-使用真正的裸体TCP服务器,可以发送和 接收连接。创建具有最小值的服务器 并使用它来测试客户端的行为。使用 简单的TCP服务器,您可以测试客户端如何发送和接收数据 消息及其与服务器的连接和断开连接方式。另一个 有用的测试是几个客户端如何连接并向 服务器
  • 单元测试-使用模拟可以测试更复杂的场景。你 将无法发送或接收消息,但您可以测试 客户端的内部逻辑-如果两条消息 到达,错误时重新发送等

  • 使用这两种测试,您应该能够涵盖客户的大部分功能

    此类测试不是单元测试,而是所谓的集成测试。单元测试不涉及任何网络连接,而是模拟它们只测试单元;只要tcp连接和服务器是完全独立的,它仍然是一个单元测试。但是,如果它确实需要外部支持(比如必须启动http服务器),它就不再是单元测试了。输入/输出可以来自函数的参数和返回值,也可以通过使用外部接口(从函数接收“输入”并向其提供“输出”)来实现。只要您不使用自己代码的其他“单元”,创建和提供外部接口的“模拟”仍然是单元测试(您仍然在测试单个单元)。创建虚拟服务器套接字与通过参数提供输入和通过返回值检索输出是一样的。是的,我想你是对的,我一直认为单元测试应该很小,不依赖任何东西。但我忘了问自己我想测试什么?我试图测试另一个系统的tcp服务器的行为,然后我只需要为它们编写集成类型的单元测试。