我正在开发一个用于通过 HTTP 进行通信的 Java 库,我想测试它在出现丢包、高延迟、低带宽和拥塞等网络问题时的可靠性和性能。我使用 Apache 的 httpclient 库 进行客户端连接,并使用 Java 自己的 com.sun.net.httpserver.HttpServer 启动 HTTP 服务器。
是否有可用的库可以做这种事情,或者我应该自己推出?我想我可以尝试将我自己的 org.apache.http.conn.scheme.SchemeSocketFactory 插入客户端,并模拟上面提到的几个问题,但我更喜欢使用已经可以工作的东西:-)
这类似于问题为单元测试创建 TCP 网络错误,但我正在寻找涉及 Linux 上的 Java 的解决方案。我查看了针对该问题建议的点击,但我不确定它能否提供我正在寻找的内容。
由于 Java API 无法访问低级网络 API,因此对其进行模拟将具有挑战性。
或者,Apache HTTP Core 组件库可能有一些东西可以帮助您模拟延迟和数据丢失以及可能的带宽问题。该库具有注入您自己的会话输入和输出缓冲区的功能。您可以在HTTP Core 的高级功能
找到文档通过注入你自己的缓冲区
您还可以查看 Grinder 项目中提供的 TCPProxy。我没有仔细看过。文档显示了 EchoFilter 作为示例,但我相信应该可以扩展过滤器以延迟流中字节的发送和接收。但使用代理来模拟网络问题是有意义的。这样你的客户端和服务器就可以对正在进行的测试一无所知。
在这两种情况下,网络问题的模拟似乎是 Java 中所能做到的最大努力。 或者,您可以设置本地防火墙并将其配置为拦截和处理它收到的数据包。
希望这对您有帮助。
如果您不是对系统进行集成测试,即使用外部服务器运行完整堆栈等,那么您正在寻找使用模拟工具。它们允许您记录您正在使用的库的行为。这可以节省您运行库代码的时间,而无需验证。
使用mockito之类的东西,或者如果需要的话PowerMock,您可以告诉库在调用您调用的方法时抛出异常。
示例:
import static org.mockito.Mockito.mock
import static org.mockito.Mockito.when
...
@Test(expected=HttpException.class)
public void invockationThrowsHttpException() {
...
HttpClient httpClient = mock(HttpClient.class)
when(httpClient).executeMethod(args...).thenThrow(HttpException...)
underTest.invokeCodeUnderTest(args...)
...
}
上面的示例假设使用 JUnit4。 Mockito 网站上有一个非常好的教程。如果您需要模拟mockito不模拟的东西(例如静态或最终方法),请使用PowerMock。
顺便说一句,我注意到 Apache 的 HTTP 客户端已终止生命周期,他们建议改用 Apache HTTP 组件。如果您的项目仍处于早期阶段,那么现在可能值得切换。
您应该考虑使用像WANEM这样的WAN模拟器,而不是尝试实现网络错误(在您的情况下,这可能意味着修改httpclient库或模拟服务器中的错误和延迟)。在我看来,这将是一个更简单、更可行的解决方案。
帖子很旧了,但万一有人以某种方式来到这里(就像我一样:)
在集成测试中故意发明网络滞后的方法称为“混沌测试”,并且由于 Netflix 而广为人知,该测试部门开发了一个工具/框架“Chaos Monkey”。 有一个很酷的项目,使用这种方法 Toxiproxy 来自 Shopify,它也有 Java 实现
toxiproxy-java尤其是它与 Testcontainers 一起闪耀,可以模拟微服务网络的一部分甚至整个微服务网络 (⁰o⁰) -->
Toxiproxy 与 Testcontainers