Java commons-httpclient:测试超时值
Java commons-httpclient: Testing timeout values
摘要:开发者如何集成测试 http 请求超时?
背景故事:我的团队遇到了与异常持久的 HTTP Web 请求相关的问题。我们使用 Apache 的 commons-httpclient
版本 3。代码看起来类似于:
PostMethod post = new PostMethod(endpoint);
post.getParams().setSoTimeout(someInt);
httpClient.executeMethod(post);
完成此请求的时间通常是可以接受的(2 秒左右),但偶尔,尽管我们的 SO 超时设置为 4 秒,但我们还是会看到 50-60 秒的请求。这促使我做了一些研究,发现大多数人都在设置连接超时 ANNNNND SO 超时。似乎应该将 SO 超时设置得更低(因为它们只是计算传输中字节之间的距离),并且连接超时是我们最初计划使用的(即请求和返回的第一个字节之间的初始延迟)。
这是我们抓取并计划使用的代码:
httpClient.getHttpConnectionManager().getParams()
.setConnectionTimeout(someInt);
httpClient.getHttpConnectionManager().getParams()
.setSoTimeout(someInt);
这里的主要问题是我们无法集成测试此更改。更准确地说,我们对如何集成测试从套接字连接到外部服务器的延迟感到困惑。在深入研究 commons-httpclient
之后,我看到了我们将不得不重现的受保护和私有 classes(因为它们不可扩展且无法从 class 外部使用),模拟并将 class 串在一起=37=]es 最终进入 java 中的套接字 class (它依赖于 java native
方法——我们还需要复制和注入通过模拟——我在那个级别不经常看到的东西)。
我接触 Stack Overflow 的原因是想看看其他人如何测试 this/not 测试这个。我想不惜一切代价避免在性能环境中测试此功能。
我的另一个想法是设置模拟服务器以可编程延迟时间响应 httpclient。我还没有看到这样的例子。
首先,没有单元测试 http 请求之类的东西——那将是集成测试。
其次,您可以使用JMeter 等工具发送http 请求并测试是否在一定时间内收到响应as shown here in JMeter。
采用模拟服务器路线,我设法设置了一个带有 API 端点的小型 Web 服务器,我可以对其进行测试。相关代码如下:
轻量级服务器设置:
TJWSEmbeddedJaxrsServer server = new TJWSEmbeddedJaxrsServer();
server.setPort(SERVER_PORT);
server.getDeployment().getResources().add(new TestResource());
server.start();
API端点:
/**
* In order to test the timeout, the resource will be injected into an embedded server.
* Each endpoint should have a unique use case.
*/
@Path("tests")
public class TestResource {
@POST
@Produces({MediaType.APPLICATION_XML})
@Path("socket-timeout")
public Response testSocketTimeout() throws InterruptedException {
Thread.sleep(SOCKET_TIMEOUT_SLEEP);
return Response.ok().build();
}
}
在 api 端点相关 class 中,我可以控制睡眠超时,然后在 httpclient class 中触发套接字超时。它有点 hacky,但它可以按照我想要的方式测试功能(简单、轻量级和有效)。
摘要:开发者如何集成测试 http 请求超时?
背景故事:我的团队遇到了与异常持久的 HTTP Web 请求相关的问题。我们使用 Apache 的 commons-httpclient
版本 3。代码看起来类似于:
PostMethod post = new PostMethod(endpoint);
post.getParams().setSoTimeout(someInt);
httpClient.executeMethod(post);
完成此请求的时间通常是可以接受的(2 秒左右),但偶尔,尽管我们的 SO 超时设置为 4 秒,但我们还是会看到 50-60 秒的请求。这促使我做了一些研究,发现大多数人都在设置连接超时 ANNNNND SO 超时。似乎应该将 SO 超时设置得更低(因为它们只是计算传输中字节之间的距离),并且连接超时是我们最初计划使用的(即请求和返回的第一个字节之间的初始延迟)。 这是我们抓取并计划使用的代码:
httpClient.getHttpConnectionManager().getParams()
.setConnectionTimeout(someInt);
httpClient.getHttpConnectionManager().getParams()
.setSoTimeout(someInt);
这里的主要问题是我们无法集成测试此更改。更准确地说,我们对如何集成测试从套接字连接到外部服务器的延迟感到困惑。在深入研究 commons-httpclient
之后,我看到了我们将不得不重现的受保护和私有 classes(因为它们不可扩展且无法从 class 外部使用),模拟并将 class 串在一起=37=]es 最终进入 java 中的套接字 class (它依赖于 java native
方法——我们还需要复制和注入通过模拟——我在那个级别不经常看到的东西)。
我接触 Stack Overflow 的原因是想看看其他人如何测试 this/not 测试这个。我想不惜一切代价避免在性能环境中测试此功能。 我的另一个想法是设置模拟服务器以可编程延迟时间响应 httpclient。我还没有看到这样的例子。
首先,没有单元测试 http 请求之类的东西——那将是集成测试。
其次,您可以使用JMeter 等工具发送http 请求并测试是否在一定时间内收到响应as shown here in JMeter。
采用模拟服务器路线,我设法设置了一个带有 API 端点的小型 Web 服务器,我可以对其进行测试。相关代码如下:
轻量级服务器设置:
TJWSEmbeddedJaxrsServer server = new TJWSEmbeddedJaxrsServer();
server.setPort(SERVER_PORT);
server.getDeployment().getResources().add(new TestResource());
server.start();
API端点:
/**
* In order to test the timeout, the resource will be injected into an embedded server.
* Each endpoint should have a unique use case.
*/
@Path("tests")
public class TestResource {
@POST
@Produces({MediaType.APPLICATION_XML})
@Path("socket-timeout")
public Response testSocketTimeout() throws InterruptedException {
Thread.sleep(SOCKET_TIMEOUT_SLEEP);
return Response.ok().build();
}
}
在 api 端点相关 class 中,我可以控制睡眠超时,然后在 httpclient class 中触发套接字超时。它有点 hacky,但它可以按照我想要的方式测试功能(简单、轻量级和有效)。