Java CommonHttpClient:测试超时值
摘要:开发者如何集成测试http请求的超时
背景故事:我的团队遇到了与异常持久的HTTP web请求相关的问题。我们使用Apache的commons-httpclient
版本3。代码与此类似:
PostMethod post = new PostMethod(endpoint);
post.getParams().setSoTimeout(someInt);
httpClient.executeMethod(post);
完成此请求的时间通常是可以接受的(2秒左右),但偶尔,我们会看到50-60秒的请求,尽管so超时设置为4秒。这促使我做了一些研究,发现大多数人都设置了连接超时。似乎应该将超时设置得更低(因为它们只是对传输中字节之间的距离进行计时),而连接超时是我们最初计划使用的(即请求和返回的第一个字节之间的初始延迟)。 以下是我们收集并计划使用的代码:
httpClient.getHttpConnectionManager().getParams()
.setConnectionTimeout(someInt);
httpClient.getHttpConnectionManager().getParams()
.setSoTimeout(someInt);
这里的主要痛苦是我们无法测试这种变化。更准确地说,我们对如何集成测试从socket连接到外部服务器的延迟感到困惑。在深入挖掘commons-httpclient
之后,我看到了我们必须复制的受保护类和私有类(因为它们在类外是不可维护和不可用的),mock并将这些类串在一起,最终进入java中的socket类(它依赖于一个java native
方法——我们还需要通过mock来复制和注入它——这是我在该级别不经常看到的)
我接触Stack Overflow的原因是想看看其他人是如何测试这个/不测试这个的。我希望不惜一切代价避免在性能环境中测试此功能。 我的另一个想法是设置一个mockserver,以可编程的延迟时间响应httpclient。我还没见过这样的例子
# 1 楼答案
采用模拟服务器的方式,我成功地建立了一个小型web服务器,该服务器带有一个API端点,可以对其进行测试。以下是相关代码:
轻量级服务器设置:
API端点:
在api端点相关类中,我可以控制睡眠超时,然后触发httpclient类中的套接字超时。这有点老套,但它可以按照我想要的方式(简单、轻量级和有效)测试功能
# 2 楼答案
首先,没有单元测试http请求这样的事情——那就是集成测试
其次,您可以使用JMeter之类的工具发送http请求,并测试响应是否在一定时间内被接收as shown here in JMeter