首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我自己的http服务器的TCP机器状态的单元测试

我自己的http服务器的TCP机器状态的单元测试
EN

Stack Overflow用户
提问于 2013-04-11 17:23:41
回答 4查看 332关注 0票数 0

我使用的是http服务器的新实现。我将创建单元测试,它将帮助我检查TCP连接状态的状态机是否工作正常。

当然,我需要检查一些简单的事情,比如:我的服务器是在收到RST之后切换到closed状态,还是在序列SYN, SYN+ACK, ACK之后切换到established

因为这个状态机中可能的路径数量非常多,所以我想知道我应该关注哪些测试。

例如,Apache有没有什么公共单元测试,我可以从中提取一个模式?

第二件事是...我应该从应用程序的角度开始创建这个测试,所以我应该专注于创建测试,这些测试可以使用简单的java套接字,使用connectsend等命令来模拟。

EN

回答 4

Stack Overflow用户

发布于 2013-04-15 08:58:33

测试的内容

每种单元测试策略的一般目标是:

测试代码覆盖率(

  1. full suit.
  2. full coverage ):这意味着在规范的完整测试覆盖期间,应用程序的每一行代码至少执行一次:通常,软件开发从一个功能规范开始,该规范准确地说明了软件在每个可能的场景中做了什么以及它是如何反应的。规范中提到的每个需求至少需要一次测试。当您没有规范时,最少测试的指导原则可以是the specification of the HTTP protocol itself.

当您测试服务器应用程序时,您必须记住,您不能假设您的客户端将是HTTP协议的完美实现。在现实世界中,您的服务器将面对错误实现它或具有不可靠连接的客户端,这些连接在您的应用程序的任何状态下都会突然终止。这还不包括那些故意试图发现和利用服务器中的漏洞的恶意客户端。这些也是您需要测试用例的情况。

服务器通常是多线程的。这意味着多线程带来的常见问题(如竞争条件、死锁、同步问题、繁忙旋转等)应该进行测试。不幸的是,这些问题很难预测,甚至更难为其编写有意义的单元测试。不仅是因为这些问题通常是通过不同组件之间的交互来表现出来的,这是集成和系统测试的范围,而不是单元测试。

如何测试

单元测试通常不应该依赖于外部资源,因为当它们依赖外部资源时,您测试的是该资源,而不是您自己的应用程序。当应用程序的功能在很大程度上依赖于外部系统时,比如http服务器,就应该模拟另一个系统。

这是通过使用mock objects实现外部资源来实现的。模拟对象是取代依赖于外部资源的对象的对象(通过扩展它或通过实现相同的接口),但仅模拟其行为。在the服务器的上下文中,您将创建一个扩展Socket的类,但使用模拟外部客户端而不实际访问网络的东西覆盖Socket的所有方法。

然后在单元测试期间使用它来测试您的类,而不是普通的套接字。

这使您可以轻松地实现特殊的模拟套接字来测试特殊的测试条件,例如客户端响应缓慢、非常快或完全错误。

你可能想知道“但是当我在我想要测试的类中创建一个new Socket()时,我应该怎么做呢?”答案是,为了使应用程序单元可测试,您不应该这样做。关键字是Dependency Injection。简单地说,依赖注入意味着类永远不应该使用new关键字,除非它是该类的工厂或生成器。类使用的任何对象都不应该由它创建。它们应该通过构造函数或setter方法提供给它。

示例:

因此,当您有一个ConnectionListener类,它使用ServerSocket等待客户端连接,然后对它们执行某些操作时,您不应该在其构造函数中创建该ServerSocket。相反,您应该向ConnectionListener的构造函数传递一个ServerSocket。在生产代码中,这将是a normal server socket。但是在您的单元测试中,您可以传递一个扩展ServerSocket的模拟对象。此模拟对象将模拟一个或多个客户端,然后如果ConnectionListener的行为符合预期,则向单元测试框架报告。

票数 4
EN

Stack Overflow用户

发布于 2013-04-15 09:37:06

当然,我需要检查一些简单的事情,比如:我的服务器是在收到RST后切换到关闭状态,还是在序列SYN,SYN+ACK,

之后切换到established状态。

当然不是。你没有资格去测试这些东西。如果供应商的TCP/IP堆栈被破坏,它将很快在世界各地显现出来。测试它是供应商的责任。您应该在自己的新HTTP服务器上测试自己的代码。

票数 3
EN

Stack Overflow用户

发布于 2013-04-19 05:00:34

例如,

有任何公共单元测试,我可以从中提取模式吗?

你可以看看Apache Tomcat tests

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

https://stackoverflow.com/questions/15945140

复制
相关文章

相似问题

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