首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单元测试插座

单元测试插座
EN

Stack Overflow用户
提问于 2010-12-28 05:02:17
回答 2查看 4.5K关注 0票数 10

你好啊,花草,

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

例如,我有一个Connector_Tcp类,它实现诸如读、写、打开和关闭等方法。

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

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

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

我担心绑定冲突(地址已经在使用中)和阻塞等问题。我不希望单元测试失败,因为端口已经被与我的应用程序无关的系统服务所使用。

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

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

我想我的问题是:

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

  • 套接字已被另一个进程使用;
  • 单元测试写得不好;或
  • 该方法行为不当(这就是单元测试的价值所在)。

我需要单元测试,只有当方法运行正常或不正常时,才能进行测试.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-29 06:18:34

我编写了一个类似的抽象层,尽管是用C/C++编写的,我也有机会对基于套接字的代码进行单元测试。我不知道这里是否存在PHP固有的特定特性,所以我只提供我能提供的一般性建议。

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

Stack Overflow用户

发布于 2010-12-29 05:33:11

希望我能正确理解你的问题..。如果没有,请告诉我。但我要做的是嘲笑插座。这将使您能够编写一系列单元测试,以确保您的方法在各种情况下都能完成所有正确的事情。

例如,您可以编写一个单元测试,告诉套接字模拟实例抛出一个“端口不可用”异常。在这种情况下,您可以断言您的方法捕获了异常,并使用异常中的相同文本记录了异常。

更重要的是,您可以编写一个单元测试,它告诉套接字模拟实例从read()返回一个有效的字节流,然后您可以断言您的方法对这些字节做了正确的事情。

所以你不是在测试套接字。您正在设置套接字以模拟某些事件,并且正在测试与套接字一起工作的代码是否做了正确的事情。

(我在Java、C#、Ruby和JavaScript中使用了模拟框架。我从未使用过PHP,但我敢打赌有一些很好的模拟框架。

编辑:是的,PHP有一些模拟框架。我不能推荐一个,但以下是我能找到的一对:PHPUnitLastCraft

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4543773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档