【问题标题】:Simulate network connectivity issues on Linux using Java使用 Java 在 Linux 上模拟网络连接问题
【发布时间】:2015-12-16 00:13:14
【问题描述】:

我想对以下场景进行自动化测试:

  1. 用户登录并执行一些“冗长”的操作。例如尝试上传文件。
  2. 在漫长的操作过程中,与服务器的连接会丢失一段时间,然后再恢复。
  3. 在这种情况下,应用程序会做它应该做的任何事情。例如,向用户显示一条消息,询问他们是否要重试。

我希望步骤 1. 和 3. 由 Selenium 完成。问题是:作为自动化测试的一部分,我该如何执行第 2 步?

工具和环境的详细信息:

  1. Selenium 使用 Junit 在 Java 上运行
  2. 测试必须在 Linux 和 Windows 上运行
  3. 它还可以在 3 种浏览器上运行:Firefox、Chrome、IE 11

我正在考虑的几个解决方案:

  • 调用一些脚本来操作机器上的连接。
  • 操纵浏览器的代理设置(代理指向虚假地址,因此连接中断)。
  • 使用真正的代理,可以通过代码控制(例如通过某些命令),因此它可以表现为“工作”或“断开”连接。

由于各种原因,这些解决方案都不理想。

那么:有没有人尝试解决类似的问题?想听听您认为可行的解决方案或替代想法。谢谢。

【问题讨论】:

  • 只需拔出网线即可。
  • @Scary Wombat:鉴于我想在自动化测试中进行,我需要一个与 selenium 测试同步的机器人来做到这一点
  • 这里的问题是你说的是“使用JAVA”。有一些答案,但您至少需要 JNI,因为连接问题发生在低于 java 可以访问的层中
  • @snovelli:我应该能够以某种方式从 Java 控制它,但它不一定是破坏连接的 Java 代码。 IE。如果你有另一个服务/组件/应用程序可以进行实际中断,那没关系,只要我能告诉它从 Java 代码中做什么。

标签: java linux windows selenium networking


【解决方案1】:

选项 1

存根

您必须确定抛出的异常是什么,以及在真实案例场景中抛出异常的组件是什么。你可以很容易地做到这一点,在你的机器上模拟场景,当异常被抛出时,stack-trace会告诉你究竟是哪个组件抛出了它。

然后您必须扩展引发异常的组件并将其注入到适当的位置,最终创建一个 API 来触发该异常。

如果您认为需要一个框架来自动执行此类测试,请查看Fitnesse


选项 2

模拟

模拟一个真实的网络问题,会过于复杂,而且在这种情况下(imo)的好处是不值得的。

无论如何... Linux 有一个出色的内置网络仿真层,称为netem,它允许与网络流量进行任何类型的无缝交互。此内核模块由tc 命令行界面控制。

当您想将这些条件应用于单个端口时,要做到这一点并不容易,因为您必须:

  • Netfilter 规则来标记我们想要限制的数据包
  • 流量控制政策
  • 过滤以将数据包绑定到策略

一个简单的例子是,如果你想在整个 eth0 上丢包 10%,在这种情况下你会使用:

tc qdisc change dev eth0 root netem loss 10%

然后你必须以某种 java 可控的方式包装这个功能。 如果我没有劝阻你,这里有一个很好的指南:TrafficControl

【讨论】:

  • 感谢您的详细解答。我们在单元测试级别有选项 1,但希望在用户级别测试上“更现实”。
【解决方案2】:

你可以在windows上cmd上执行以下命令来断开和重新连接网络。

> ipconfig /release
> ipconfig /renew

使用它,您可以使用Java Runtime 类来执行命令。

Runtime.getRuntime().exec("ipconfig /release");

我已经在 Windows 上进行了测试,它可以工作。 Linux等效的cmd命令如下

> sudo ifconfig eth0 up
> sudo ifconfig eth0 down

注意这里的 eth0 是我的以太网连接的名称。您可以使用

列出所有连接的名称
> ifconfig -a

可以看下面的线程通过Java执行bash——How to execute bash command with sudo privileges in Java?

【讨论】:

  • 谢谢。虽然如果我必须通过脚本来完成,我宁愿使用tc 或操纵iptables,因为禁用网络连接或释放 IP 与暂时失去网络连接完全不同。
猜你喜欢
  • 2018-02-12
  • 2021-02-24
  • 1970-01-01
  • 1970-01-01
  • 2020-04-05
  • 1970-01-01
  • 2011-06-28
  • 1970-01-01
  • 2011-07-15
相关资源
最近更新 更多