使用Java模拟Linux上的网络连接问题

时间:2015-12-16 00:13:15

标签: java linux windows selenium networking

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

  1. 用户登录并执行一些"冗长的"操作。例如,尝试上传文件。
  2. 在漫长的操作过程中,与服务器的连接会丢失一段时间,然后恢复。
  3. 应用程序执行本案例中应该执行的任何操作。例如,向用户显示一条消息,询问他们是否要重试。
  4. 我希望步骤1.和3.由Selenium完成。问题是:作为自动化测试的一部分,我该如何进行第2步?

    有关工具和环境的详细信息:

    1. Selenium在Java上使用Junit
    2. 测试必须在Linux和Windows上运行
    3. 它还可以在3种浏览器上运行:Firefox,Chrome,IE 11
    4. 我在想的几个解决方案:

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

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

      所以:有没有人试图解决类似的问题?希望听到您认为可行的解决方案或其他想法。感谢。

2 个答案:

答案 0 :(得分:1)

您可以在cmd上的Windows上执行以下命令以断开连接并重新连接网络。

> ipconfig /release
> ipconfig /renew

使用此方法,您可以使用Java Runtime类来执行命令。

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

我在Windows上测试了这个并且它可以工作。 cmd命令的Linux等效项如下

> sudo ifconfig eth0 up
> sudo ifconfig eth0 down

请注意,eth0此处是以太网连接的名称。您可以使用

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

您可以查看以下线程以通过Java执行bash - How to execute bash command with sudo privileges in Java?

答案 1 :(得分:1)

选项1

Stubbing

您必须确定抛出的异常是什么以及在实际案例场景中抛出它的组件是什么。您可以轻松地执行此操作,模拟计算机中的方案,并在抛出异常时,堆栈跟踪将准确地告诉您抛出的组件。

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

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

选项2

<强>模拟

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

无论如何...... Linux拥有一个优秀的内置网络仿真层,名为netem,可以与网络流量进行任何形式的无缝交互。此内核模块由tc命令行界面控制。

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

  • Netfilter规则标记我们要限制的数据包
  • 交通管制政策
  • 过滤将数据包绑定到策略

一个简单的例子是,如果你想在整个eth0上丢包10%,那么你将使用:

tc qdisc change dev eth0 root netem loss 10%

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