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,但它可以按照我想要的方式测试功能(简单、轻量级和有效)。