【发布时间】:2011-05-31 10:27:30
【问题描述】:
问候 Stackoverflowers,
我有一个应用程序,其中存在通信抽象层。这一层中的每个实现,称为 connector,为我的应用程序提供了一种与连接的对等方交换数据的方式(例如:通过 HTTP、TCP 套接字、UDP 套接字等)。
例如,我有一个 Connector_Tcp 类,它实现了 read、write、open 和 close。
我需要为该类编写一个单元测试。我知道单元测试应该尽可能少的依赖。不幸的是,在这种情况下,依赖是一个系统资源:一个套接字;我无法绕过它。
我需要一些关于如何对这个类进行单元测试的建议。
在我看来,即使这个类正在使用系统资源,也应该像所有其他连接器一样对其进行测试,以确保它符合我的应用程序建立的标准。
我担心诸如绑定冲突(地址已在使用错误)和阻塞之类的事情。我不希望单元测试失败,因为该端口已被与我的应用程序无关的系统服务使用。
我这几天做过很多单元测试,但没有一个依赖于套接字这样的低级资源。
您将如何对依赖于套接字的类进行单元测试?为每个单元打开一个插座?使用单个服务器类,然后使用手动定义的套接字资源连接到它并对其进行测试......?
我想我的问题确实如下:
如果单元测试失败...我怎么知道:
- 套接字已被另一个进程使用;
- 单元测试写得不好;或
- 该方法行为不正确(这是单元测试的价值)。
我需要单元测试来测试方法是否正常运行...
【问题讨论】:
-
我没有做过任何真正的 PHP 开发,但是你能创建一个从你的 Socket 类派生的模拟类吗?
-
@Dave:我可以。我对每个需要连接器的类都使用模拟对象。我的问题是:我需要测试套接字类本身以确保它尊重抽象层的约定......通过测试模拟对象,它并不能清楚地告诉我套接字类是否有效。
-
在我看来,单元测试的内容是有实际限制的。我不会尝试对套接字进行单元测试。我想在你的情况下,由于套接字可以在你的应用程序之外访问,你只需要尽你所能围绕连接器编写单元测试并确保它处理所有异常情况。您提到了“地址已在使用”错误,所以我要做的一件事是确保我的连接器不会因为这种情况而死。我会做一个单元测试来创建这个条件并确保它捕捉到它。
标签: php unit-testing sockets