有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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。我还没见过这样的例子


共 (2) 个答案

  1. # 1 楼答案

    采用模拟服务器的方式,我成功地建立了一个小型web服务器,该服务器带有一个API端点,可以对其进行测试。以下是相关代码:

    轻量级服务器设置:

    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类中的套接字超时。这有点老套,但它可以按照我想要的方式(简单、轻量级和有效)测试功能

  2. # 2 楼答案

    首先,没有单元测试http请求这样的事情——那就是集成测试

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