【问题标题】:Java commons-httpclient: Testing timeout valuesJava commons-httpclient:测试超时值
【发布时间】: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


    【解决方案1】:

    采用模拟服务器路由,我设法设置了一个带有 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 端点相关类中,我可以控制睡眠超时,然后触发 httpclient 类中的套接字超时。它有点 hacky,但它可以按照我想要的方式测试功能(简单、轻量且有效)。

    【讨论】:

      【解决方案2】:

      首先,没有单元测试 http 请求之类的东西 - 那将是集成测试。

      其次,您可以使用JMeter之类的工具发送http请求并测试是否在一定时间内收到响应as shown here in JMeter

      【讨论】:

      • 你有提到的 jmeter 能力的例子吗?
      • 嘿,我确实这样做了。我继续并将其添加到我的答案中(显示它的 SO 响应)。
      猜你喜欢
      • 2017-03-03
      • 1970-01-01
      • 2016-06-06
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多