单元测试插座

net*_*der 10 php sockets unit-testing

问候Stackoverflowers,

我有一个应用程序,其中存在通信抽象层.此层中的每个实现(称为连接器)都为我的应用程序提供了一种与连接的对等方交换数据的方式(例如:通过HTTP,TCP套接字,UDP套接字等).

每个例子,我有一个Connector_Tcp实现,,打开关闭等方法的类.

我需要为该课程编写单元测试.我知道单元测试应该具有尽可能少的依赖性.不幸的是,在这种情况下,依赖是一个系统资源:一个套接字; 我无法绕过它.

我需要一些关于如何进行单元测试的建议.

在我看来,即使这个类正在使用系统资源,它应该作为所有其他连接器进行测试,以确保它遵守我的应用程序建立的标准.

我担心绑定冲突(Address has in use errors)和阻塞等问题.我不希望单元测试失败,因为该端口已被与我的应用程序无关的系统服务使用.

在我的日子里,我做了很多单元测试,但是没有一个单元测试依赖于套接字这样的低级资源.

您将如何进行单元测试依赖于套接字的类?为每个单元打开一个插座?使用单个服务器类,然后手动定义的套接字资源连接到它并测试它?

我猜我的问题确实如下:

如果单元测试失败......我怎么知道:

  • 套接字已被另一个进程使用;
  • 单元测试写得不好; 要么
  • 该方法表现不正确(这是单元测试的价值).

我需要单元测试才能测试方法是否正常运行...

axw*_*axw 5

我写了一个类似的抽象层,虽然在C/C++中,我有机会对基于套接字的代码进行单元测试.我不知道这里是否有任何固有的PHP特定内容,所以我只提供我可以提供的通用建议.

  • 在您的设置中创建服务器套接字,在拆除时将其关闭.根据您是否支持许多连接到服务器套接字的客户端,您可能希望在测试方法中执行该部分.
  • 假设您可以在客户端代码中指定要连接的端口,请让服务器套接字绑定到端口0(临时端口),然后在客户端代码中使用它.这将消除绑定到已使用的端口的问题.
  • 在套接字上设置超时.如果您的测试因某些意外原因而失败,您不希望它永远等待连接.
  • 您需要能够交错客户端/服务器行为.例如,您将要测试如果服务器在客户端读/写中途关闭其连接端的情况会发生什么.异步I/O或多线程都可以完成这项工作.我不确定你在PHP中拥有什么.