Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java commons httpclient:测试超时值_Java_Integration Testing_Apache Commons Httpclient - Fatal编程技术网

Java commons httpclient:测试超时值

Java commons httpclient:测试超时值,java,integration-testing,apache-commons-httpclient,Java,Integration Testing,Apache Commons Httpclient,摘要:开发者如何集成测试http请求的超时 背景故事:我的团队遇到了与异常持久的HTTP web请求相关的问题。我们使用Apache的commons httpclientVersion3。代码与此类似: PostMethod post = new PostMethod(endpoint); post.getParams().setSoTimeout(someInt); httpClient.executeMethod(post); 完成此请求的时间通常是可以接受的(2秒左右),但偶尔,我们会看

摘要:开发者如何集成测试http请求的超时

背景故事:我的团队遇到了与异常持久的HTTP web请求相关的问题。我们使用Apache的
commons httpclient
Version3。代码与此类似:

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);
这里最主要的痛苦是我们无法对这种变化进行集成测试。更准确地说,我们对如何集成测试从套接字连接到外部服务器的延迟感到困惑。在深入研究了
commons httpclient
之后,我看到了我们将不得不复制的受保护类和私有类(因为它们在类之外是不可扩展和不可用的),模拟并串接这些类,最终进入java中的socket类(它依赖于一个java
native
方法——我们还需要通过mock来复制和注入这个方法——这是我在这个级别上不经常看到的)

我接触Stack Overflow的原因是为了了解其他人是如何测试此功能的/不是如何测试此功能的。我希望不惜一切代价避免在性能环境中测试此功能。
我的另一个想法是设置一个mockserver,以可编程的延迟时间响应httpclient。我还没有看到这样的例子。

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


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

通过模拟服务器路由,我成功地设置了一个带有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类中的套接字超时。这有点粗糙,但它可以以我想要的方式测试功能(简单、轻量级和有效).

您是否有您提到的jmeter功能的示例?嘿,我当然有。我继续并将其添加到我的答案中(一个显示它的SO响应)。