【发布时间】:2019-08-24 03:54:55
【问题描述】:
摘要:开发人员如何集成测试http请求超时?
背景故事:我的团队遇到了与异常持久的 HTTP Web 请求相关的问题。我们使用 Apache 的commons-httpclient 版本 3。代码如下所示:
PostMethod post = new PostMethod(endpoint);
post.getParams().setSoTimeout(someInt);
httpClient.executeMethod(post);
完成此请求的时间通常是可以接受的(2 秒左右),但偶尔我们会看到 50-60 秒的请求,尽管我们的 SO 超时设置为 4 秒。这促使我进行了一些研究,发现大多数人都在设置 Connection Timeouts ANNNNND SO 超时。看起来 SO 超时应该设置得较低(因为它们只是计算传输中字节之间的距离),而连接超时是我们最初计划使用的(即请求和返回的第一个字节之间的初始延迟)。 这是我们抓取并计划使用的代码:
httpClient.getHttpConnectionManager().getParams()
.setConnectionTimeout(someInt);
httpClient.getHttpConnectionManager().getParams()
.setSoTimeout(someInt);
这里的主要痛苦是我们无法集成测试此更改。更准确地说,我们对如何集成测试来自套接字连接到外部服务器的延迟感到困惑。在挖掘了commons-httpclient 之后,我看到了我们必须复制的受保护和私有类(因为它们在类外是不可扩展和不可用的),模拟并将这些类串在一起,最终得到 java 中的套接字类(它依赖于 java native 方法——我们还需要通过模拟复制和注入它——我在那个级别上不经常看到的东西)。
我联系 Stack Overflow 的原因是想看看其他人是如何测试这个/不测试这个的。我想不惜一切代价避免在性能环境中测试此功能。 我的另一个想法是设置一个 mockserver 以可编程的延迟时间响应 httpclient。我还没有看到这样的例子。
【问题讨论】:
标签: java integration-testing apache-commons-httpclient